{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Analyze the export on hpatches"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/yyjau/Documents/deepSfm_test\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>.container { width:100% !important; }</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import os\n",
    "import sys\n",
    "module_path = os.path.abspath(os.path.join('..'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)\n",
    "print(module_path)\n",
    "%matplotlib inline\n",
    "from IPython.core.display import display, HTML\n",
    "display(HTML(\"<style>.container { width:100% !important; }</style>\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## keypoints histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "folders:  ['superpoint_coco40_15_170k_hpatches_nms4_det0.015']\n"
     ]
    }
   ],
   "source": [
    "# folders\n",
    "from pathlib import Path\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from imageio import imread\n",
    "def load_as_float(path):\n",
    "    return imread(path).astype(np.float32)/255\n",
    "\n",
    "# folders = ['superpoint_pretrained_hpatches', 'superpoint_coco20_8_170k_hpatches', \\\n",
    "#            'magicpoint_coco_new1_10k_hpatches']\n",
    "# folders = ['superpoint_coco2_3_hpatches-a4']\n",
    "folders = ['superpoint_coco40_15_170k_hpatches_nms4_det0.015']\n",
    "# folders = ['superpoint_pretrained_hpatches', 'superpoint_coco20_5_50k_hpatches']\n",
    "\n",
    "# parameters\n",
    "scale = 10\n",
    "count = 1\n",
    "\n",
    "base_path = '../logs'\n",
    "prediction = 'predictions'\n",
    "\n",
    "print(\"folders: \", folders)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'torch'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-3-6bcbc8203288>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgetLabels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpoints_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimg_shape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m     \u001b[0mpnts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpoints_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pts'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m     \u001b[0mpnts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpnts\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0mlabels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg_shape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimg_shape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'torch'"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "def getLabels(points_path, img_shape):\n",
    "    pnts = np.load(points_path)['pts']\n",
    "    pnts = pnts.astype(int)\n",
    "    labels = np.zeros((img_shape[0], img_shape[1]))\n",
    "    labels[pnts[:, 1], pnts[:, 0]] = 1\n",
    "    labels_2D = torch.tensor(labels[np.newaxis,:,:], dtype=torch.float32)\n",
    "    return labels_2D, pnts\n",
    "\n",
    "def pnts2img(pnts, img_shape):\n",
    "    pnts = pnts.astype(int)\n",
    "    labels = np.zeros((img_shape[0], img_shape[1]))\n",
    "    labels[pnts[:, 0], pnts[:, 1]] = 1  # pnts (y,x)\n",
    "    labels_2D = torch.tensor(labels[np.newaxis,:,:], dtype=torch.float32)\n",
    "    return labels_2D, pnts\n",
    "\n",
    "def warpLabels(pnts, homography, H, W):\n",
    "    \"\"\"\n",
    "    input: \n",
    "        pnts: numpy\n",
    "        homography: numpy\n",
    "    output:\n",
    "        warped_pnts: numpy\n",
    "    \"\"\"\n",
    "    from utils.utils import warp_points\n",
    "    from utils.utils import filter_points\n",
    "    pnts = torch.tensor(pnts).long()\n",
    "    homography = torch.tensor(homography, dtype=torch.float32)\n",
    "    warped_pnts = warp_points(torch.stack((pnts[:, 0], pnts[:, 1]), dim=1),\n",
    "                                   homography) # check the (x, y)\n",
    "    warped_pnts = filter_points(warped_pnts, torch.tensor([W, H])).round().long()\n",
    "    return warped_pnts.numpy()\n",
    "\n",
    "def img_overlap(img_r, img_g, img_gray):  # img_b repeat\n",
    "    img = np.concatenate((img_gray, img_gray, img_gray), axis=0)\n",
    "    img[0, :, :] += img_r[0, :, :]\n",
    "    img[1, :, :] += img_g[0, :, :]\n",
    "    img[img > 1] = 1\n",
    "    img[img < 0] = 0\n",
    "    img = img.transpose([1,2,0])\n",
    "\n",
    "    return img\n",
    "\n",
    "def printImgPnts(image, pnts):\n",
    "    img_shape = image.shape\n",
    "\n",
    "    print(img_shape)\n",
    "    labels_2D, pnts = pnts2img(keypoints, img_shape)\n",
    "    labels_2D = labels_2D.squeeze().numpy()\n",
    "    print(\"labels \", labels_2D.shape)\n",
    "\n",
    "    img_r = np.zeros_like(image)\n",
    "    overlap = img_overlap(img_r[np.newaxis,:,:], \n",
    "                          labels_2D[np.newaxis,:,:], image[np.newaxis,:,:])\n",
    "    print(overlap.shape)\n",
    "    plt.imshow(overlap)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "##### edit here\n",
    "\n",
    "def getNumPoints(data, verbose=False):\n",
    "    # read data\n",
    "    image = data['image']\n",
    "    warped_image = data['warped_image']\n",
    "    real_H = data['homography']\n",
    "    keypoints = data['prob'][:,[1, 0]] # (y, x)\n",
    "    desc = data['desc']\n",
    "    warped_keypoints = data['warped_prob'][:,[1, 0]]\n",
    "    if verbose:\n",
    "        print(\"keypoints shape: \", keypoints.shape)\n",
    "        print(\"desc shape: \", desc.shape)\n",
    "    \n",
    "    # unwarp points, filter\n",
    "    from numpy.linalg import inv\n",
    "    H, W = image.shape\n",
    "    unwarped_keypoints = warpLabels(warped_keypoints, inv(real_H), H, W)\n",
    "    \n",
    "    # return number of points\n",
    "    ## average the points in 2 images\n",
    "    return [keypoints.shape[0], warped_keypoints.shape[0], unwarped_keypoints.shape[0], \n",
    "            (keypoints.shape[0]+unwarped_keypoints.shape[0])/2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(580, 4)\n"
     ]
    }
   ],
   "source": [
    "# repeatibility\n",
    "\n",
    "# images_num = 10\n",
    "# rows = images_num\n",
    "# cols = len(folders)\n",
    "# plt.figure(figsize=(cols*2*scale, rows*scale))\n",
    "# task_folder = ['repeatibility3']\n",
    "# count = 1\n",
    "\n",
    "all_num_points = []\n",
    "for folder in folders:\n",
    "    num_points = [] # [[keypoints, warped_keypoints, unwarped_keypoints]]\n",
    "    exp_path = Path(base_path, folder, prediction)\n",
    "    files = os.listdir( exp_path )\n",
    "    for f in files:\n",
    "    #     print(\"file: \", f)\n",
    "        if f[-3:] == 'npz':\n",
    "    #         print(\"file: \", f)\n",
    "            data = np.load(exp_path/f)        \n",
    "            num_points.append(getNumPoints(data))\n",
    "    #         print(\"points: \", getNumPoints(data))\n",
    "    # file =  exp_path / '0.npz'\n",
    "\n",
    "    num_points = np.array(num_points)\n",
    "    print(num_points.shape)\n",
    "    all_num_points.append(num_points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotHist(vect, title='untitled', label='', range=(0,2000), plot=True):\n",
    "    import matplotlib.pyplot as plt\n",
    "    rng = np.random.RandomState(10)  # deterministic random data\n",
    "#     a = np.hstack((rng.normal(size=1000),\n",
    "#                    rng.normal(loc=5, scale=2, size=1000)))\n",
    "    plt.hist(vect, bins='auto', alpha=0.5, histtype='bar', range=range, label=label)  # arguments are passed to np.histogram\n",
    "    plt.title(title)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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HMOGDSM4OJgrV67w2GOP4e/vT1BQEH/729+KtF+UKmua0CugyMhIR5O2cXFxJCUlkZqaytq1a+nSpQvPPvsscXFxbN26lf/9739s3brVMW29evXYsmULQ4YMAaxmAeLj43nttdcYPXo0AM8++yzdu3cnNjaWmJgYJk+eTHJyMq+//jrVqlVj165dPP3002zevLnAWE+dOkV0dDTPPPMM0dHRrFixgr179xIbG0t8fDybN29mzZo1jB49mnnz5gGQkZHBwoULueeeewCIjY1lzpw57Ny5k/379/P5559z/PhxpkyZwqpVq4iPj2fTpk1ZXuSRae/evUycOJEdO3ZQu3ZtPvvsMwYNGkRYWBjz588nPj6ey5cvs2TJEnbs2MHWrVv5xz/+cW07SKkyogm9AurQoQObN2/m4sWLVKlShYiICOLi4li7di2RkZF8+umnhIaGEhISwo4dO9i5c6dj2j/96U9Z5jV06FAAunTpwsWLFzl//jwrVqxgxowZBAcHExUVRUpKCocPH2bNmjWOJBsUFERQUFC+caamptKjRw+ef/55evbsCcCKFStYsWIFISEhhIaGsnv3bvbu3YuPjw/16tXjxx9/dAyvV68eYDUi1rJlSzw8PBg6dCjr1q1j06ZNREVF0aBBAypXrsywYcNYs2ZNjhh8fX0JDg52bLfc2m2vVasWXl5ejBkzhs8//1zfh6oqLJfucjHGTALGAgJsA0YBNwILgXrAZuBeEfm1hOJ0O+nJWd896lHd9TtjPD098fX1Ze7cudx6660EBQURExPDvn37qFq1KrNmzWLTpk3UqVOHkSNHkpKS4pi2erbl5NYmuojw2Wef0aZNmyKs2W8qV65Mhw4d+Oabb+jatSsAIsLUqVO5//77c4w/duxY5s6dy8mTJx2/FvKK0VXZ223PrZqocuXKxMbG8t1337F48WJeeeUVVq1a5fIylCo3RCTfP6AJcBCoand/Coy0/w+x+70BPFDQvDp06CDuYOfOnVm6TyWfyvLnil9PnsryV1hPPfWUNGvWTFauXCknT56UZs2aSf/+/SU+Pl6CgoIkPT1dTp48KQ0bNpT3339fRERatGghiYmJjnl07dpV7r//fhERWbt2rQQEBIiIyNSpU2XixImSkZEhIiJbtmwREZF///vfMmbMGBER2bZtm3h4eMimTZvyjLF69eqSlpYmAwYMkBkzZoiIyDfffCPh4eFy6dIlERE5evSonDplrf/Vq1eldevW4uvrK2lpaSIiEhMTI15eXnLgwAFJT0+XXr16yeLFi+X48ePSvHlzSUxMlLS0NOnRo4csXbo0y3oePHhQ2rVr54hn5syZ8tRTT4mISN++fWXVqlUiInLp0iVHDOfPn5e6desWen8oVVyy5xcRESBOCsivIuLyfeiVgarGmFSgGnAC6A7cbQ//AJgGvH7tXzHKFZGRkTz77LNERERQvXp1vLy8iIyMpH379oSEhNC2bVuaNWtG586d852Pl5cXISEhpKamOt4m9MQTT/DII48QFBRERkYGvr6+LF++nAceeIBRo0bh5+eHn58fHTp0KDBODw8PFixYwB133EGNGjWYMGECu3btIiIiArBubfzoo49o2LAhN9xwA926daN27dp4eHg45tGxY0cefPBB9u3bR7du3RgwYACVKlVixowZdOvWDREhOjqafv36ubz9Ro4cyfjx46latSr//e9/6devHykpKYgIL7zwgsvzUapccSXrAw8DSUAiMB+oD+xzGt4M2J7HtOOAOCCuefPmJfWlVqrKQwm9OHTt2jXfEnZpS09Pl/bt28uePXsc/WJiYiQ6OroMo1KqdF1LCb3Ai6LGmDpAP8AXaAxUB/oU4gvjLREJE5GwBg0auP5No64rO3fu5Oabb6ZHjx60atWqrMNRqkJypcrlduCgiCQCGGM+BzoDtY0xlUUkDWgKHCu5MN3Ur5d++3wxHWreWKqLX716dbHM55ZbbuHq1atZ+n344YcEBga6PA9/f38OHDiQo39UVBRRUVHXGqJS1wVXEvphoJMxphpwBeiBVYUSAwzCutNlBLCspIJU5dvGjRvLOgSlFC4kdBHZaIxZDGwB0oAfgbeAr4CFxpjpdr93SzLQiqS8v2NUKeWeXLrLRUSeAp7K1vsAEF7sESmllCoSfVJUKaXchLaHXgw+2PFBvsOr59I+enpSMqT/diHRw8sTqtQAYELwhOINUCl1XdASuipV+bWRvnr1avr27VuK0ViOHz/OoEGDChzvn//8ZylEo1TRaUJXLhERR7O17qZx48YsXry4wPE0oavyThN6BZSQkEBAQICje9asWUybNo2oqCimTJlCeHg4rVu3djSxGx0d7WhCNyQkhGeeeQaw2iB/++23SUpKokePHoSGhhIYGOho/zwhIYE2bdowfPhwAgICOHLkCN7e3kyaNIl27drRo0cPEhMTAdi/fz99+vShQ4cOREZGsnv3bgAOHjxIREQEgYGBhWqWdtOmTYSEhLB///4822fv0qUL8fHxjmluu+02fvrpJ6ZNm8a9995LREQErVq14u233wasL6XJkycTEBBAYGAgn3zySY7tOXfuXO6880769OlDq1atePTRRwF47LHHuHLlCsHBwQwbNozk5GSio6Np3749AQEBjnkpVZY0oZdjpy6m5PqXeOkqaRmS6zRpaWnExsby0ksv8fTTTwO/tZ9+4cIFKleuzPr16wEc7ad7eXmxZMkStmzZQkxMDH/9618zm21g7969TJgwgR07dtCiRQuSk5MJCwtjx44ddO3a1bGMcePGMWfOHDZv3sysWbOYMMG6DvDwww/zwAMPsG3bNm680bUHpzZs2MD48eNZtmwZN910U57ts48ZM4a5c+cCsGfPHlJSUmjfvj0AW7duZdWqVXz//fc888wzHD9+nM8//5z4+Hh++uknvv32WyZPnsyJEydyLD8+Pp5PPvmEbdu28cknn3DkyBFmzJhB1apViY+PZ/78+Xz99dc0btyYn376ie3bt9Onj8sPTytVYjShu5k777wTyNr2d2RkJGvWrGH9+vVER0eTlJTE5cuXOXjwIG3atEFE+Pvf/05QUBC33347x44d49SpUwC0aNGCTp06OeZfqVIlR5vq99xzD+vWrSMpKYkNGzYwePBggoODuf/++x2Jcv369Y421++9994C49+1axfjxo3jyy+/pHnz5gB5ts8+ePBgli9f7mhYbOTIkY759OvXj6pVq1K/fn26detGbGws69atY+jQoXh4eNCoUSO6du3Kpk2bcsTQo0cPRxvp/v7+HDp0KMc4gYGBrFy5kilTprB27Vpq1apV4LopVdL0LpcKqHJljyz12c7tnWe2/+3h4UFaWhpgtVYYFxdHy5Yt6dmzJ2fOnOHtt992tJY4f/58EhMT2bx5M56envj4+Djmmb399OyMMWRkZFC7du0s1R/Zx3HVjTfeSEpKCj/++CONGzcGyLd99p49e7Js2TI+/fTTLG9QKs421DO3o7PWrVuzZcsW/vOf//CPf/yDHj168OSTT7q8DKVKgib0YjCi3Yh8h+f2pGjqqdNZ2nLxrFXN5bZcGjRsxNnERM6ePYu3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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "titles = ['keypoints', 'warped_keypoints', 'unwarped_keypoints', \n",
    "          'average over keypoints and unwarped keypoints']\n",
    "\n",
    "for f_idx in range(len(folders)):\n",
    "    num_points = all_num_points[f_idx]\n",
    "    for i in range(num_points.shape[1]):\n",
    "    #     plotHist(num_points[:,i], titles[i], alpha=0.5)\n",
    "        plotHist(num_points[:,i], label=titles[i], title=folders[f_idx])\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plot under different threshold\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## descriptor distance histogram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "folders:  ['superpoint_coco40_15_170k_hpatches_nms4_det0.015']\n"
     ]
    }
   ],
   "source": [
    "# folders = ['superpoint_pretrained_hpatches', 'superpoint_coco20_7_170k_hpatches', \\\n",
    "#            'superpoint_coco20_8_170k_hpatches']\n",
    "# folders = ['superpoint_coco20_5_50k_hpatches']\n",
    "print(\"folders: \", folders)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def getInliers(matches, H, epi=3, verbose=False):\n",
    "    \"\"\"\n",
    "    input:\n",
    "        matches: numpy (n, 4(x1, y1, x2, y2))\n",
    "        H (ground truth homography): numpy (3, 3)\n",
    "    \"\"\"\n",
    "    from evaluations.detector_evaluation import warp_keypoints\n",
    "    # warp points \n",
    "    warped_points = warp_keypoints(matches[:, :2], H) # make sure the input fits the (x,y)\n",
    "    \n",
    "    # compute point distance\n",
    "    norm = np.linalg.norm(warped_points - matches[:, 2:4],\n",
    "                            ord=None, axis=1)\n",
    "    inliers = norm < epi\n",
    "    if verbose:\n",
    "        print(\"Total matches: \", inliers.shape[0], \", inliers: \", inliers.sum(),\n",
    "                          \", percentage: \", inliers.sum() / inliers.shape[0])\n",
    "    \n",
    "    return inliers\n",
    "\n",
    "def getInliers_cv(matches, H=None, epi=3, verbose=False):\n",
    "    import cv2\n",
    "    # count inliers: use opencv homography estimation\n",
    "    # Estimate the homography between the matches using RANSAC\n",
    "    H, inliers = cv2.findHomography(matches[:, [0, 1]],\n",
    "                                    matches[:, [2, 3]],\n",
    "                                    cv2.RANSAC)\n",
    "    inliers = inliers.flatten()\n",
    "    print(\"Total matches: \", inliers.shape[0], \", inliers: \", inliers.sum(),\n",
    "          \", percentage: \", inliers.sum() / inliers.shape[0])\n",
    "\n",
    "    return inliers\n",
    "\n",
    "def getMatches(data, verbose=False):\n",
    "    # compute all matchings from descriptor\n",
    "    from models.model_wrap import PointTracker\n",
    "    %reload_ext autoreload\n",
    "    %autoreload 2\n",
    "    \n",
    "    desc = data['desc']\n",
    "    warped_desc = data['warped_desc']\n",
    "    keypoints = data['prob'][:,[1, 0]] # (y, x)\n",
    "    warped_keypoints = data['warped_prob'][:,[1, 0]]\n",
    "\n",
    "    nn_thresh = 2\n",
    "    tracker = PointTracker(max_length=2, nn_thresh=nn_thresh)\n",
    "    # matches = tracker.nn_match_two_way(desc, warped_desc, nn_)\n",
    "    tracker.update(keypoints.T, desc.T)\n",
    "    tracker.update(warped_keypoints.T, warped_desc.T)\n",
    "    matches = tracker.get_matches().T\n",
    "    mscores = tracker.get_mscores().T\n",
    "\n",
    "    # mAP\n",
    "    # matches = data['matches']\n",
    "    if verbose:\n",
    "        print(\"matches: \", matches.shape)\n",
    "        print(\"mscores: \", mscores.shape)\n",
    "        print(\"mscore max: \", mscores.max(axis=0))\n",
    "        print(\"mscore min: \", mscores.min(axis=0))\n",
    "        \n",
    "    return matches, mscores\n",
    "\n",
    "def select_k_best(points, mask, verbose=False):\n",
    "    \"\"\" Select the k most probable points (and strip their proba).\n",
    "    points has shape (num_points, 3) where the last coordinate is the proba. \"\"\"\n",
    "    sorted_prob = points\n",
    "    if points.shape[1] > 2:\n",
    "        # add thresh\n",
    "        if verbose: print('num of points: ', points.shape)\n",
    "\n",
    "        sorted_prob = points[mask, :]\n",
    "        if verbose: print('num of points after thresh: ', sorted_prob.shape)\n",
    "\n",
    "    return sorted_prob\n",
    "\n",
    "def dataFilterDetection(data, det_thd=0, verbose=False):\n",
    "    desc = data['desc']\n",
    "    warped_desc = data['warped_desc']\n",
    "    keypoints = data['prob'] # (x, y, prob)\n",
    "    warped_keypoints = data['warped_prob']\n",
    "    \n",
    "    # create new dict\n",
    "    newData = {}\n",
    "    newData.update(data)\n",
    "    \n",
    "    # image 1\n",
    "    mask = keypoints[:,2] > det_thd\n",
    "    temp = select_k_best(desc, mask, verbose=verbose)\n",
    "    newData.update({'desc': temp})\n",
    "    temp = select_k_best(keypoints, mask, verbose=verbose)\n",
    "    newData.update({'prob': temp})\n",
    "    \n",
    "    # warped image\n",
    "    mask = warped_keypoints[:,2] > det_thd\n",
    "    temp = select_k_best(warped_desc, mask, verbose=verbose)\n",
    "    newData.update({'warped_desc': temp})\n",
    "    temp = select_k_best(warped_keypoints, mask, verbose=verbose)\n",
    "    newData.update({'warped_prob': temp})\n",
    "    \n",
    "    return newData\n",
    "    \n",
    "\n",
    "\n",
    "def inliersThds(mscore, thd, inliers):\n",
    "    \"\"\"\n",
    "    input:\n",
    "        mscore: numpy(n1,)\n",
    "        thd: numpy(t,) # different thresholds\n",
    "        inliers: numpy (n1,)\n",
    "    output:\n",
    "        num of inliers under different thd:\n",
    "            numpy (t,)\n",
    "    \"\"\"\n",
    "    mscore = mscore.reshape(mscore.shape[0], 1)\n",
    "    thd = thd.reshape(1, thd.shape[0])\n",
    "    inliers = inliers.reshape(inliers.shape[0], 1)\n",
    "    matches = mscore < thd # (n1, t)\n",
    "    n_matches = matches.sum(axis=0)\n",
    "#     print(\"n_m: \", n_matches)\n",
    "    \n",
    "    n_inliers = matches*inliers\n",
    "    \n",
    "    n_inliers = n_inliers.sum(axis=0)\n",
    "#     print(\"n_in: \", n_inliers)\n",
    "\n",
    "    return n_matches, n_inliers\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# det_thd = 0.035\n",
    "# data_test = dataFilterDetection(data, det_thd=det_thd, verbose=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compute the analysis\n",
    "- Remember to empty the array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "det threshold:  0.015\n",
      "work on  superpoint_coco40_15_170k_hpatches_nms4_det0.015\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "num of points:  (488, 256)\n",
      "num of points after thresh:  (488, 256)\n",
      "num of points:  (488, 3)\n",
      "num of points after thresh:  (488, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  175 , inliers:  79 , percentage:  0.4514285714285714\n",
      "num of points:  (288, 256)\n",
      "num of points after thresh:  (288, 256)\n",
      "num of points:  (288, 3)\n",
      "num of points after thresh:  (288, 3)\n",
      "num of points:  (361, 256)\n",
      "num of points after thresh:  (361, 256)\n",
      "num of points:  (361, 3)\n",
      "num of points after thresh:  (361, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  144 , inliers:  67 , percentage:  0.4652777777777778\n",
      "num of points:  (335, 256)\n",
      "num of points after thresh:  (335, 256)\n",
      "num of points:  (335, 3)\n",
      "num of points after thresh:  (335, 3)\n",
      "num of points:  (326, 256)\n",
      "num of points after thresh:  (326, 256)\n",
      "num of points:  (326, 3)\n",
      "num of points after thresh:  (326, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  202 , inliers:  183 , percentage:  0.905940594059406\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (435, 256)\n",
      "num of points after thresh:  (435, 256)\n",
      "num of points:  (435, 3)\n",
      "num of points after thresh:  (435, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  190 , inliers:  76 , percentage:  0.4\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "num of points:  (474, 256)\n",
      "num of points after thresh:  (474, 256)\n",
      "num of points:  (474, 3)\n",
      "num of points after thresh:  (474, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  147 , inliers:  15 , percentage:  0.10204081632653061\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  148 , inliers:  26 , percentage:  0.17567567567567569\n",
      "num of points:  (523, 256)\n",
      "num of points after thresh:  (523, 256)\n",
      "num of points:  (523, 3)\n",
      "num of points after thresh:  (523, 3)\n",
      "num of points:  (547, 256)\n",
      "num of points after thresh:  (547, 256)\n",
      "num of points:  (547, 3)\n",
      "num of points after thresh:  (547, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  292 , inliers:  210 , percentage:  0.7191780821917808\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "num of points:  (357, 256)\n",
      "num of points after thresh:  (357, 256)\n",
      "num of points:  (357, 3)\n",
      "num of points after thresh:  (357, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  135 , inliers:  35 , percentage:  0.25925925925925924\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  193 , percentage:  0.7366412213740458\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (426, 256)\n",
      "num of points after thresh:  (426, 256)\n",
      "num of points:  (426, 3)\n",
      "num of points after thresh:  (426, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  8 , percentage:  0.05673758865248227\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (498, 256)\n",
      "num of points after thresh:  (498, 256)\n",
      "num of points:  (498, 3)\n",
      "num of points after thresh:  (498, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  290 , inliers:  197 , percentage:  0.6793103448275862\n",
      "num of points:  (358, 256)\n",
      "num of points after thresh:  (358, 256)\n",
      "num of points:  (358, 3)\n",
      "num of points after thresh:  (358, 3)\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  62 , percentage:  0.4397163120567376\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (459, 256)\n",
      "num of points after thresh:  (459, 256)\n",
      "num of points:  (459, 3)\n",
      "num of points after thresh:  (459, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  318 , inliers:  272 , percentage:  0.8553459119496856\n",
      "num of points:  (358, 256)\n",
      "num of points after thresh:  (358, 256)\n",
      "num of points:  (358, 3)\n",
      "num of points after thresh:  (358, 3)\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  147 , inliers:  71 , percentage:  0.48299319727891155\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  234 , inliers:  153 , percentage:  0.6538461538461539\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  90 , percentage:  0.5487804878048781\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  255 , inliers:  193 , percentage:  0.7568627450980392\n",
      "num of points:  (318, 256)\n",
      "num of points after thresh:  (318, 256)\n",
      "num of points:  (318, 3)\n",
      "num of points after thresh:  (318, 3)\n",
      "num of points:  (338, 256)\n",
      "num of points after thresh:  (338, 256)\n",
      "num of points:  (338, 3)\n",
      "num of points after thresh:  (338, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  121 , inliers:  40 , percentage:  0.3305785123966942\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "num of points:  (406, 256)\n",
      "num of points after thresh:  (406, 256)\n",
      "num of points:  (406, 3)\n",
      "num of points after thresh:  (406, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  238 , inliers:  150 , percentage:  0.6302521008403361\n",
      "num of points:  (278, 256)\n",
      "num of points after thresh:  (278, 256)\n",
      "num of points:  (278, 3)\n",
      "num of points after thresh:  (278, 3)\n",
      "num of points:  (274, 256)\n",
      "num of points after thresh:  (274, 256)\n",
      "num of points:  (274, 3)\n",
      "num of points after thresh:  (274, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  209 , inliers:  196 , percentage:  0.937799043062201\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  124 , inliers:  19 , percentage:  0.1532258064516129\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  287 , inliers:  235 , percentage:  0.818815331010453\n",
      "num of points:  (242, 256)\n",
      "num of points after thresh:  (242, 256)\n",
      "num of points:  (242, 3)\n",
      "num of points after thresh:  (242, 3)\n",
      "num of points:  (253, 256)\n",
      "num of points after thresh:  (253, 256)\n",
      "num of points:  (253, 3)\n",
      "num of points after thresh:  (253, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  123 , inliers:  85 , percentage:  0.6910569105691057\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  159 , inliers:  66 , percentage:  0.41509433962264153\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "num of points:  (368, 256)\n",
      "num of points after thresh:  (368, 256)\n",
      "num of points:  (368, 3)\n",
      "num of points after thresh:  (368, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  79 , percentage:  0.4817073170731707\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  221 , inliers:  116 , percentage:  0.5248868778280543\n",
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "num of points:  (538, 256)\n",
      "num of points after thresh:  (538, 256)\n",
      "num of points:  (538, 3)\n",
      "num of points after thresh:  (538, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  249 , inliers:  168 , percentage:  0.6746987951807228\n",
      "num of points:  (542, 256)\n",
      "num of points after thresh:  (542, 256)\n",
      "num of points:  (542, 3)\n",
      "num of points after thresh:  (542, 3)\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  187 , inliers:  47 , percentage:  0.25133689839572193\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "num of points:  (409, 256)\n",
      "num of points after thresh:  (409, 256)\n",
      "num of points:  (409, 3)\n",
      "num of points after thresh:  (409, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  219 , inliers:  146 , percentage:  0.6666666666666666\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "num of points:  (316, 256)\n",
      "num of points after thresh:  (316, 256)\n",
      "num of points:  (316, 3)\n",
      "num of points after thresh:  (316, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  227 , inliers:  157 , percentage:  0.6916299559471366\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  132 , inliers:  55 , percentage:  0.4166666666666667\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  292 , inliers:  225 , percentage:  0.7705479452054794\n",
      "num of points:  (218, 256)\n",
      "num of points after thresh:  (218, 256)\n",
      "num of points:  (218, 3)\n",
      "num of points after thresh:  (218, 3)\n",
      "num of points:  (226, 256)\n",
      "num of points after thresh:  (226, 256)\n",
      "num of points:  (226, 3)\n",
      "num of points after thresh:  (226, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  172 , inliers:  167 , percentage:  0.9709302325581395\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "num of points:  (503, 256)\n",
      "num of points after thresh:  (503, 256)\n",
      "num of points:  (503, 3)\n",
      "num of points after thresh:  (503, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  250 , inliers:  194 , percentage:  0.776\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "num of points:  (324, 256)\n",
      "num of points after thresh:  (324, 256)\n",
      "num of points:  (324, 3)\n",
      "num of points after thresh:  (324, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  97 , inliers:  17 , percentage:  0.17525773195876287\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "num of points:  (499, 256)\n",
      "num of points after thresh:  (499, 256)\n",
      "num of points:  (499, 3)\n",
      "num of points after thresh:  (499, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  245 , inliers:  118 , percentage:  0.4816326530612245\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "num of points:  (416, 256)\n",
      "num of points after thresh:  (416, 256)\n",
      "num of points:  (416, 3)\n",
      "num of points after thresh:  (416, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  250 , inliers:  198 , percentage:  0.792\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  270 , inliers:  243 , percentage:  0.9\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  274 , inliers:  187 , percentage:  0.6824817518248175\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (384, 256)\n",
      "num of points after thresh:  (384, 256)\n",
      "num of points:  (384, 3)\n",
      "num of points after thresh:  (384, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  131 , inliers:  42 , percentage:  0.32061068702290074\n",
      "num of points:  (245, 256)\n",
      "num of points after thresh:  (245, 256)\n",
      "num of points:  (245, 3)\n",
      "num of points after thresh:  (245, 3)\n",
      "num of points:  (243, 256)\n",
      "num of points after thresh:  (243, 256)\n",
      "num of points:  (243, 3)\n",
      "num of points after thresh:  (243, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  105 , inliers:  69 , percentage:  0.6571428571428571\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  253 , inliers:  204 , percentage:  0.8063241106719368\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  225 , inliers:  192 , percentage:  0.8533333333333334\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  251 , inliers:  192 , percentage:  0.7649402390438247\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "num of points:  (480, 256)\n",
      "num of points after thresh:  (480, 256)\n",
      "num of points:  (480, 3)\n",
      "num of points after thresh:  (480, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  237 , inliers:  160 , percentage:  0.6751054852320675\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "num of points:  (458, 256)\n",
      "num of points after thresh:  (458, 256)\n",
      "num of points:  (458, 3)\n",
      "num of points after thresh:  (458, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  271 , inliers:  187 , percentage:  0.6900369003690037\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "num of points:  (392, 256)\n",
      "num of points after thresh:  (392, 256)\n",
      "num of points:  (392, 3)\n",
      "num of points after thresh:  (392, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  178 , inliers:  94 , percentage:  0.5280898876404494\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (424, 256)\n",
      "num of points after thresh:  (424, 256)\n",
      "num of points:  (424, 3)\n",
      "num of points after thresh:  (424, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  169 , inliers:  74 , percentage:  0.4378698224852071\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "num of points:  (361, 256)\n",
      "num of points after thresh:  (361, 256)\n",
      "num of points:  (361, 3)\n",
      "num of points after thresh:  (361, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  198 , inliers:  162 , percentage:  0.8181818181818182\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  207 , inliers:  81 , percentage:  0.391304347826087\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "num of points:  (441, 256)\n",
      "num of points after thresh:  (441, 256)\n",
      "num of points:  (441, 3)\n",
      "num of points after thresh:  (441, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  289 , inliers:  264 , percentage:  0.9134948096885813\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "num of points:  (299, 256)\n",
      "num of points after thresh:  (299, 256)\n",
      "num of points:  (299, 3)\n",
      "num of points after thresh:  (299, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  120 , percentage:  0.6703910614525139\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "num of points:  (493, 256)\n",
      "num of points after thresh:  (493, 256)\n",
      "num of points:  (493, 3)\n",
      "num of points after thresh:  (493, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  217 , inliers:  146 , percentage:  0.6728110599078341\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "num of points:  (378, 256)\n",
      "num of points after thresh:  (378, 256)\n",
      "num of points:  (378, 3)\n",
      "num of points after thresh:  (378, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  168 , inliers:  85 , percentage:  0.5059523809523809\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  264 , inliers:  194 , percentage:  0.7348484848484849\n",
      "num of points:  (528, 256)\n",
      "num of points after thresh:  (528, 256)\n",
      "num of points:  (528, 3)\n",
      "num of points after thresh:  (528, 3)\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  297 , inliers:  222 , percentage:  0.7474747474747475\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  227 , inliers:  150 , percentage:  0.6607929515418502\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  144 , inliers:  53 , percentage:  0.3680555555555556\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "num of points:  (368, 256)\n",
      "num of points after thresh:  (368, 256)\n",
      "num of points:  (368, 3)\n",
      "num of points after thresh:  (368, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  74 , percentage:  0.524822695035461\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "num of points:  (350, 256)\n",
      "num of points after thresh:  (350, 256)\n",
      "num of points:  (350, 3)\n",
      "num of points after thresh:  (350, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  110 , percentage:  0.6214689265536724\n",
      "num of points:  (318, 256)\n",
      "num of points after thresh:  (318, 256)\n",
      "num of points:  (318, 3)\n",
      "num of points after thresh:  (318, 3)\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  122 , inliers:  6 , percentage:  0.04918032786885246\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "num of points:  (496, 256)\n",
      "num of points after thresh:  (496, 256)\n",
      "num of points:  (496, 3)\n",
      "num of points after thresh:  (496, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  188 , inliers:  100 , percentage:  0.5319148936170213\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "num of points:  (346, 256)\n",
      "num of points after thresh:  (346, 256)\n",
      "num of points:  (346, 3)\n",
      "num of points after thresh:  (346, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  148 , inliers:  73 , percentage:  0.49324324324324326\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  168 , inliers:  70 , percentage:  0.4166666666666667\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  118 , percentage:  0.6243386243386243\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "num of points:  (478, 256)\n",
      "num of points after thresh:  (478, 256)\n",
      "num of points:  (478, 3)\n",
      "num of points after thresh:  (478, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  136 , inliers:  6 , percentage:  0.04411764705882353\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  208 , percentage:  0.7938931297709924\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  268 , inliers:  164 , percentage:  0.6119402985074627\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (507, 256)\n",
      "num of points after thresh:  (507, 256)\n",
      "num of points:  (507, 3)\n",
      "num of points after thresh:  (507, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  162 , inliers:  55 , percentage:  0.3395061728395062\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "num of points:  (489, 256)\n",
      "num of points after thresh:  (489, 256)\n",
      "num of points:  (489, 3)\n",
      "num of points after thresh:  (489, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  425 , inliers:  392 , percentage:  0.9223529411764706\n",
      "num of points:  (328, 256)\n",
      "num of points after thresh:  (328, 256)\n",
      "num of points:  (328, 3)\n",
      "num of points after thresh:  (328, 3)\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  252 , inliers:  176 , percentage:  0.6984126984126984\n",
      "num of points:  (335, 256)\n",
      "num of points after thresh:  (335, 256)\n",
      "num of points:  (335, 3)\n",
      "num of points after thresh:  (335, 3)\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  205 , inliers:  186 , percentage:  0.9073170731707317\n",
      "num of points:  (577, 256)\n",
      "num of points after thresh:  (577, 256)\n",
      "num of points:  (577, 3)\n",
      "num of points after thresh:  (577, 3)\n",
      "num of points:  (524, 256)\n",
      "num of points after thresh:  (524, 256)\n",
      "num of points:  (524, 3)\n",
      "num of points after thresh:  (524, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  190 , inliers:  36 , percentage:  0.18947368421052632\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (362, 256)\n",
      "num of points after thresh:  (362, 256)\n",
      "num of points:  (362, 3)\n",
      "num of points after thresh:  (362, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  75 , percentage:  0.47468354430379744\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "num of points:  (407, 256)\n",
      "num of points after thresh:  (407, 256)\n",
      "num of points:  (407, 3)\n",
      "num of points after thresh:  (407, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  113 , percentage:  0.5978835978835979\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "num of points:  (508, 256)\n",
      "num of points after thresh:  (508, 256)\n",
      "num of points:  (508, 3)\n",
      "num of points after thresh:  (508, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  63 , percentage:  0.38414634146341464\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "num of points:  (532, 256)\n",
      "num of points after thresh:  (532, 256)\n",
      "num of points:  (532, 3)\n",
      "num of points after thresh:  (532, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  269 , inliers:  165 , percentage:  0.6133828996282528\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "num of points:  (413, 256)\n",
      "num of points after thresh:  (413, 256)\n",
      "num of points:  (413, 3)\n",
      "num of points after thresh:  (413, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  245 , inliers:  204 , percentage:  0.8326530612244898\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "num of points:  (471, 256)\n",
      "num of points after thresh:  (471, 256)\n",
      "num of points:  (471, 3)\n",
      "num of points after thresh:  (471, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  77 , percentage:  0.4074074074074074\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  87 , percentage:  0.58\n",
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "num of points:  (510, 256)\n",
      "num of points after thresh:  (510, 256)\n",
      "num of points:  (510, 3)\n",
      "num of points after thresh:  (510, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  294 , inliers:  233 , percentage:  0.7925170068027211\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  174 , inliers:  136 , percentage:  0.7816091954022989\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  255 , inliers:  209 , percentage:  0.8196078431372549\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  163 , inliers:  79 , percentage:  0.48466257668711654\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "num of points:  (280, 256)\n",
      "num of points after thresh:  (280, 256)\n",
      "num of points:  (280, 3)\n",
      "num of points after thresh:  (280, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  113 , inliers:  33 , percentage:  0.2920353982300885\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "num of points:  (362, 256)\n",
      "num of points after thresh:  (362, 256)\n",
      "num of points:  (362, 3)\n",
      "num of points after thresh:  (362, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  194 , inliers:  150 , percentage:  0.7731958762886598\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  241 , inliers:  137 , percentage:  0.5684647302904564\n",
      "num of points:  (304, 256)\n",
      "num of points after thresh:  (304, 256)\n",
      "num of points:  (304, 3)\n",
      "num of points after thresh:  (304, 3)\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  191 , inliers:  127 , percentage:  0.6649214659685864\n",
      "num of points:  (440, 256)\n",
      "num of points after thresh:  (440, 256)\n",
      "num of points:  (440, 3)\n",
      "num of points after thresh:  (440, 3)\n",
      "num of points:  (459, 256)\n",
      "num of points after thresh:  (459, 256)\n",
      "num of points:  (459, 3)\n",
      "num of points after thresh:  (459, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  386 , inliers:  374 , percentage:  0.9689119170984456\n",
      "num of points:  (304, 256)\n",
      "num of points after thresh:  (304, 256)\n",
      "num of points:  (304, 3)\n",
      "num of points after thresh:  (304, 3)\n",
      "num of points:  (281, 256)\n",
      "num of points after thresh:  (281, 256)\n",
      "num of points:  (281, 3)\n",
      "num of points after thresh:  (281, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  191 , inliers:  150 , percentage:  0.7853403141361257\n",
      "num of points:  (382, 256)\n",
      "num of points after thresh:  (382, 256)\n",
      "num of points:  (382, 3)\n",
      "num of points after thresh:  (382, 3)\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  214 , inliers:  186 , percentage:  0.8691588785046729\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  209 , inliers:  154 , percentage:  0.7368421052631579\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "num of points:  (270, 256)\n",
      "num of points after thresh:  (270, 256)\n",
      "num of points:  (270, 3)\n",
      "num of points after thresh:  (270, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  95 , inliers:  29 , percentage:  0.30526315789473685\n",
      "num of points:  (394, 256)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "num of points:  (392, 256)\n",
      "num of points after thresh:  (392, 256)\n",
      "num of points:  (392, 3)\n",
      "num of points after thresh:  (392, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  252 , inliers:  213 , percentage:  0.8452380952380952\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "num of points:  (518, 256)\n",
      "num of points after thresh:  (518, 256)\n",
      "num of points:  (518, 3)\n",
      "num of points after thresh:  (518, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  236 , inliers:  106 , percentage:  0.4491525423728814\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  326 , inliers:  235 , percentage:  0.7208588957055214\n",
      "num of points:  (440, 256)\n",
      "num of points after thresh:  (440, 256)\n",
      "num of points:  (440, 3)\n",
      "num of points after thresh:  (440, 3)\n",
      "num of points:  (455, 256)\n",
      "num of points after thresh:  (455, 256)\n",
      "num of points:  (455, 3)\n",
      "num of points after thresh:  (455, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  300 , inliers:  248 , percentage:  0.8266666666666667\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "num of points:  (350, 256)\n",
      "num of points after thresh:  (350, 256)\n",
      "num of points:  (350, 3)\n",
      "num of points after thresh:  (350, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  140 , inliers:  80 , percentage:  0.5714285714285714\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  224 , inliers:  175 , percentage:  0.78125\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  232 , percentage:  0.8854961832061069\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "num of points:  (423, 256)\n",
      "num of points after thresh:  (423, 256)\n",
      "num of points:  (423, 3)\n",
      "num of points after thresh:  (423, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  160 , inliers:  70 , percentage:  0.4375\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "num of points:  (547, 256)\n",
      "num of points after thresh:  (547, 256)\n",
      "num of points:  (547, 3)\n",
      "num of points after thresh:  (547, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  169 , inliers:  50 , percentage:  0.2958579881656805\n",
      "num of points:  (278, 256)\n",
      "num of points after thresh:  (278, 256)\n",
      "num of points:  (278, 3)\n",
      "num of points after thresh:  (278, 3)\n",
      "num of points:  (260, 256)\n",
      "num of points after thresh:  (260, 256)\n",
      "num of points:  (260, 3)\n",
      "num of points after thresh:  (260, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  174 , inliers:  140 , percentage:  0.8045977011494253\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  228 , inliers:  174 , percentage:  0.7631578947368421\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "num of points:  (378, 256)\n",
      "num of points after thresh:  (378, 256)\n",
      "num of points:  (378, 3)\n",
      "num of points after thresh:  (378, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  161 , inliers:  80 , percentage:  0.4968944099378882\n",
      "num of points:  (218, 256)\n",
      "num of points after thresh:  (218, 256)\n",
      "num of points:  (218, 3)\n",
      "num of points after thresh:  (218, 3)\n",
      "num of points:  (214, 256)\n",
      "num of points after thresh:  (214, 256)\n",
      "num of points:  (214, 3)\n",
      "num of points after thresh:  (214, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  135 , percentage:  0.9\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  162 , inliers:  63 , percentage:  0.3888888888888889\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "num of points:  (538, 256)\n",
      "num of points after thresh:  (538, 256)\n",
      "num of points:  (538, 3)\n",
      "num of points after thresh:  (538, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  252 , inliers:  149 , percentage:  0.5912698412698413\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  263 , inliers:  234 , percentage:  0.8897338403041825\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  183 , inliers:  127 , percentage:  0.6939890710382514\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "num of points:  (326, 256)\n",
      "num of points after thresh:  (326, 256)\n",
      "num of points:  (326, 3)\n",
      "num of points after thresh:  (326, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  203 , inliers:  153 , percentage:  0.7536945812807881\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (404, 256)\n",
      "num of points after thresh:  (404, 256)\n",
      "num of points:  (404, 3)\n",
      "num of points after thresh:  (404, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  276 , inliers:  242 , percentage:  0.8768115942028986\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  241 , inliers:  173 , percentage:  0.7178423236514523\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  163 , inliers:  74 , percentage:  0.4539877300613497\n",
      "num of points:  (328, 256)\n",
      "num of points after thresh:  (328, 256)\n",
      "num of points:  (328, 3)\n",
      "num of points after thresh:  (328, 3)\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  166 , inliers:  105 , percentage:  0.6325301204819277\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  270 , inliers:  240 , percentage:  0.8888888888888888\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "num of points:  (371, 256)\n",
      "num of points after thresh:  (371, 256)\n",
      "num of points:  (371, 3)\n",
      "num of points after thresh:  (371, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  140 , inliers:  65 , percentage:  0.4642857142857143\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "num of points:  (432, 256)\n",
      "num of points after thresh:  (432, 256)\n",
      "num of points:  (432, 3)\n",
      "num of points after thresh:  (432, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  171 , inliers:  58 , percentage:  0.3391812865497076\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "num of points:  (256, 256)\n",
      "num of points after thresh:  (256, 256)\n",
      "num of points:  (256, 3)\n",
      "num of points after thresh:  (256, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  85 , inliers:  17 , percentage:  0.2\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  157 , inliers:  84 , percentage:  0.535031847133758\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (405, 256)\n",
      "num of points after thresh:  (405, 256)\n",
      "num of points:  (405, 3)\n",
      "num of points after thresh:  (405, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  170 , inliers:  65 , percentage:  0.38235294117647056\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "num of points:  (365, 256)\n",
      "num of points after thresh:  (365, 256)\n",
      "num of points:  (365, 3)\n",
      "num of points after thresh:  (365, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  125 , inliers:  56 , percentage:  0.448\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "num of points:  (341, 256)\n",
      "num of points after thresh:  (341, 256)\n",
      "num of points:  (341, 3)\n",
      "num of points after thresh:  (341, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  217 , inliers:  178 , percentage:  0.8202764976958525\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "num of points:  (472, 256)\n",
      "num of points after thresh:  (472, 256)\n",
      "num of points:  (472, 3)\n",
      "num of points after thresh:  (472, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  273 , inliers:  181 , percentage:  0.663003663003663\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "num of points:  (361, 256)\n",
      "num of points after thresh:  (361, 256)\n",
      "num of points:  (361, 3)\n",
      "num of points after thresh:  (361, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  208 , inliers:  156 , percentage:  0.75\n",
      "num of points:  (523, 256)\n",
      "num of points after thresh:  (523, 256)\n",
      "num of points:  (523, 3)\n",
      "num of points after thresh:  (523, 3)\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  156 , inliers:  21 , percentage:  0.1346153846153846\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (405, 256)\n",
      "num of points after thresh:  (405, 256)\n",
      "num of points:  (405, 3)\n",
      "num of points after thresh:  (405, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  212 , inliers:  147 , percentage:  0.6933962264150944\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (406, 256)\n",
      "num of points after thresh:  (406, 256)\n",
      "num of points:  (406, 3)\n",
      "num of points after thresh:  (406, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  258 , inliers:  201 , percentage:  0.7790697674418605\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "num of points:  (342, 256)\n",
      "num of points after thresh:  (342, 256)\n",
      "num of points:  (342, 3)\n",
      "num of points after thresh:  (342, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  208 , inliers:  132 , percentage:  0.6346153846153846\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "num of points:  (346, 256)\n",
      "num of points after thresh:  (346, 256)\n",
      "num of points:  (346, 3)\n",
      "num of points after thresh:  (346, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  163 , inliers:  88 , percentage:  0.5398773006134969\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  258 , inliers:  192 , percentage:  0.7441860465116279\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "num of points:  (357, 256)\n",
      "num of points after thresh:  (357, 256)\n",
      "num of points:  (357, 3)\n",
      "num of points after thresh:  (357, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  224 , inliers:  148 , percentage:  0.6607142857142857\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "num of points:  (326, 256)\n",
      "num of points after thresh:  (326, 256)\n",
      "num of points:  (326, 3)\n",
      "num of points after thresh:  (326, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  129 , inliers:  64 , percentage:  0.49612403100775193\n",
      "num of points:  (288, 256)\n",
      "num of points after thresh:  (288, 256)\n",
      "num of points:  (288, 3)\n",
      "num of points after thresh:  (288, 3)\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  58 , percentage:  0.41134751773049644\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  325 , inliers:  270 , percentage:  0.8307692307692308\n",
      "num of points:  (237, 256)\n",
      "num of points after thresh:  (237, 256)\n",
      "num of points:  (237, 3)\n",
      "num of points after thresh:  (237, 3)\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  105 , inliers:  44 , percentage:  0.41904761904761906\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  112 , inliers:  22 , percentage:  0.19642857142857142\n",
      "num of points:  (542, 256)\n",
      "num of points after thresh:  (542, 256)\n",
      "num of points:  (542, 3)\n",
      "num of points after thresh:  (542, 3)\n",
      "num of points:  (558, 256)\n",
      "num of points after thresh:  (558, 256)\n",
      "num of points:  (558, 3)\n",
      "num of points after thresh:  (558, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  315 , inliers:  224 , percentage:  0.7111111111111111\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  256 , inliers:  177 , percentage:  0.69140625\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  152 , inliers:  59 , percentage:  0.3881578947368421\n",
      "num of points:  (318, 256)\n",
      "num of points after thresh:  (318, 256)\n",
      "num of points:  (318, 3)\n",
      "num of points after thresh:  (318, 3)\n",
      "num of points:  (330, 256)\n",
      "num of points after thresh:  (330, 256)\n",
      "num of points:  (330, 3)\n",
      "num of points after thresh:  (330, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  112 , inliers:  14 , percentage:  0.125\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (279, 256)\n",
      "num of points after thresh:  (279, 256)\n",
      "num of points:  (279, 3)\n",
      "num of points after thresh:  (279, 3)\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  117 , inliers:  6 , percentage:  0.05128205128205128\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "num of points:  (321, 256)\n",
      "num of points after thresh:  (321, 256)\n",
      "num of points:  (321, 3)\n",
      "num of points after thresh:  (321, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  135 , inliers:  77 , percentage:  0.5703703703703704\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  54 , percentage:  0.2857142857142857\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  256 , inliers:  192 , percentage:  0.75\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  323 , inliers:  320 , percentage:  0.9907120743034056\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "num of points:  (445, 256)\n",
      "num of points after thresh:  (445, 256)\n",
      "num of points:  (445, 3)\n",
      "num of points after thresh:  (445, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  273 , inliers:  179 , percentage:  0.6556776556776557\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (540, 256)\n",
      "num of points after thresh:  (540, 256)\n",
      "num of points:  (540, 3)\n",
      "num of points after thresh:  (540, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  160 , inliers:  15 , percentage:  0.09375\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  185 , inliers:  142 , percentage:  0.7675675675675676\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  217 , inliers:  151 , percentage:  0.695852534562212\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (414, 256)\n",
      "num of points after thresh:  (414, 256)\n",
      "num of points:  (414, 3)\n",
      "num of points after thresh:  (414, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  263 , inliers:  208 , percentage:  0.7908745247148289\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  65 , percentage:  0.43333333333333335\n",
      "num of points:  (382, 256)\n",
      "num of points after thresh:  (382, 256)\n",
      "num of points:  (382, 3)\n",
      "num of points after thresh:  (382, 3)\n",
      "num of points:  (469, 256)\n",
      "num of points after thresh:  (469, 256)\n",
      "num of points:  (469, 3)\n",
      "num of points after thresh:  (469, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  139 , inliers:  8 , percentage:  0.05755395683453238\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (405, 256)\n",
      "num of points after thresh:  (405, 256)\n",
      "num of points:  (405, 3)\n",
      "num of points after thresh:  (405, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  169 , inliers:  80 , percentage:  0.47337278106508873\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  131 , inliers:  47 , percentage:  0.35877862595419846\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  268 , inliers:  183 , percentage:  0.6828358208955224\n",
      "num of points:  (279, 256)\n",
      "num of points after thresh:  (279, 256)\n",
      "num of points:  (279, 3)\n",
      "num of points after thresh:  (279, 3)\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  110 , inliers:  6 , percentage:  0.05454545454545454\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  196 , inliers:  132 , percentage:  0.673469387755102\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  71 , percentage:  0.47333333333333333\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (384, 256)\n",
      "num of points after thresh:  (384, 256)\n",
      "num of points:  (384, 3)\n",
      "num of points after thresh:  (384, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  186 , inliers:  114 , percentage:  0.6129032258064516\n",
      "num of points:  (382, 256)\n",
      "num of points after thresh:  (382, 256)\n",
      "num of points:  (382, 3)\n",
      "num of points after thresh:  (382, 3)\n",
      "num of points:  (458, 256)\n",
      "num of points after thresh:  (458, 256)\n",
      "num of points:  (458, 3)\n",
      "num of points after thresh:  (458, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  142 , inliers:  6 , percentage:  0.04225352112676056\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "num of points:  (353, 256)\n",
      "num of points after thresh:  (353, 256)\n",
      "num of points:  (353, 3)\n",
      "num of points after thresh:  (353, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  255 , inliers:  242 , percentage:  0.9490196078431372\n",
      "num of points:  (382, 256)\n",
      "num of points after thresh:  (382, 256)\n",
      "num of points:  (382, 3)\n",
      "num of points after thresh:  (382, 3)\n",
      "num of points:  (432, 256)\n",
      "num of points after thresh:  (432, 256)\n",
      "num of points:  (432, 3)\n",
      "num of points after thresh:  (432, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  154 , inliers:  62 , percentage:  0.4025974025974026\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "num of points:  (383, 256)\n",
      "num of points after thresh:  (383, 256)\n",
      "num of points:  (383, 3)\n",
      "num of points after thresh:  (383, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  165 , inliers:  69 , percentage:  0.41818181818181815\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (499, 256)\n",
      "num of points after thresh:  (499, 256)\n",
      "num of points:  (499, 3)\n",
      "num of points after thresh:  (499, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  311 , inliers:  201 , percentage:  0.6463022508038585\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  171 , inliers:  48 , percentage:  0.2807017543859649\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "num of points:  (395, 256)\n",
      "num of points after thresh:  (395, 256)\n",
      "num of points:  (395, 3)\n",
      "num of points after thresh:  (395, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  294 , inliers:  254 , percentage:  0.8639455782312925\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "num of points:  (459, 256)\n",
      "num of points after thresh:  (459, 256)\n",
      "num of points:  (459, 3)\n",
      "num of points after thresh:  (459, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  219 , inliers:  156 , percentage:  0.7123287671232876\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  168 , inliers:  78 , percentage:  0.4642857142857143\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  257 , inliers:  205 , percentage:  0.7976653696498055\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "num of points:  (458, 256)\n",
      "num of points after thresh:  (458, 256)\n",
      "num of points:  (458, 3)\n",
      "num of points after thresh:  (458, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  62 , percentage:  0.3463687150837989\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "num of points:  (357, 256)\n",
      "num of points after thresh:  (357, 256)\n",
      "num of points:  (357, 3)\n",
      "num of points after thresh:  (357, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  306 , inliers:  297 , percentage:  0.9705882352941176\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  178 , inliers:  106 , percentage:  0.5955056179775281\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  246 , inliers:  110 , percentage:  0.44715447154471544\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "num of points:  (302, 256)\n",
      "num of points after thresh:  (302, 256)\n",
      "num of points:  (302, 3)\n",
      "num of points after thresh:  (302, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  207 , inliers:  178 , percentage:  0.8599033816425121\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "num of points:  (416, 256)\n",
      "num of points after thresh:  (416, 256)\n",
      "num of points:  (416, 3)\n",
      "num of points after thresh:  (416, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  307 , inliers:  266 , percentage:  0.8664495114006515\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "num of points:  (365, 256)\n",
      "num of points after thresh:  (365, 256)\n",
      "num of points:  (365, 3)\n",
      "num of points after thresh:  (365, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  201 , percentage:  0.8701298701298701\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (531, 256)\n",
      "num of points after thresh:  (531, 256)\n",
      "num of points:  (531, 3)\n",
      "num of points after thresh:  (531, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  317 , inliers:  280 , percentage:  0.8832807570977917\n",
      "num of points:  (218, 256)\n",
      "num of points after thresh:  (218, 256)\n",
      "num of points:  (218, 3)\n",
      "num of points after thresh:  (218, 3)\n",
      "num of points:  (209, 256)\n",
      "num of points after thresh:  (209, 256)\n",
      "num of points:  (209, 3)\n",
      "num of points after thresh:  (209, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  127 , inliers:  107 , percentage:  0.84251968503937\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  256 , inliers:  183 , percentage:  0.71484375\n",
      "num of points:  (358, 256)\n",
      "num of points after thresh:  (358, 256)\n",
      "num of points:  (358, 3)\n",
      "num of points after thresh:  (358, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  89 , percentage:  0.5632911392405063\n",
      "num of points:  (237, 256)\n",
      "num of points after thresh:  (237, 256)\n",
      "num of points:  (237, 3)\n",
      "num of points after thresh:  (237, 3)\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  130 , inliers:  62 , percentage:  0.47692307692307695\n",
      "num of points:  (288, 256)\n",
      "num of points after thresh:  (288, 256)\n",
      "num of points:  (288, 3)\n",
      "num of points after thresh:  (288, 3)\n",
      "num of points:  (347, 256)\n",
      "num of points after thresh:  (347, 256)\n",
      "num of points:  (347, 3)\n",
      "num of points after thresh:  (347, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  127 , inliers:  66 , percentage:  0.5196850393700787\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "num of points:  (347, 256)\n",
      "num of points after thresh:  (347, 256)\n",
      "num of points:  (347, 3)\n",
      "num of points after thresh:  (347, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  166 , inliers:  98 , percentage:  0.5903614457831325\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  250 , inliers:  180 , percentage:  0.72\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (388, 256)\n",
      "num of points after thresh:  (388, 256)\n",
      "num of points:  (388, 3)\n",
      "num of points after thresh:  (388, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  229 , inliers:  183 , percentage:  0.7991266375545851\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  220 , inliers:  146 , percentage:  0.6636363636363637\n",
      "num of points:  (264, 256)\n",
      "num of points after thresh:  (264, 256)\n",
      "num of points:  (264, 3)\n",
      "num of points after thresh:  (264, 3)\n",
      "num of points:  (251, 256)\n",
      "num of points after thresh:  (251, 256)\n",
      "num of points:  (251, 3)\n",
      "num of points after thresh:  (251, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  176 , inliers:  123 , percentage:  0.6988636363636364\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (450, 256)\n",
      "num of points after thresh:  (450, 256)\n",
      "num of points:  (450, 3)\n",
      "num of points after thresh:  (450, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  166 , inliers:  84 , percentage:  0.5060240963855421\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "num of points:  (291, 256)\n",
      "num of points after thresh:  (291, 256)\n",
      "num of points:  (291, 3)\n",
      "num of points after thresh:  (291, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  149 , inliers:  99 , percentage:  0.6644295302013423\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  316 , inliers:  278 , percentage:  0.879746835443038\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "num of points:  (387, 256)\n",
      "num of points after thresh:  (387, 256)\n",
      "num of points:  (387, 3)\n",
      "num of points after thresh:  (387, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  197 , inliers:  131 , percentage:  0.6649746192893401\n",
      "num of points:  (279, 256)\n",
      "num of points after thresh:  (279, 256)\n",
      "num of points:  (279, 3)\n",
      "num of points after thresh:  (279, 3)\n",
      "num of points:  (363, 256)\n",
      "num of points after thresh:  (363, 256)\n",
      "num of points:  (363, 3)\n",
      "num of points after thresh:  (363, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  105 , inliers:  11 , percentage:  0.10476190476190476\n",
      "num of points:  (245, 256)\n",
      "num of points after thresh:  (245, 256)\n",
      "num of points:  (245, 3)\n",
      "num of points after thresh:  (245, 3)\n",
      "num of points:  (282, 256)\n",
      "num of points after thresh:  (282, 256)\n",
      "num of points:  (282, 3)\n",
      "num of points after thresh:  (282, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  110 , inliers:  65 , percentage:  0.5909090909090909\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "num of points:  (435, 256)\n",
      "num of points after thresh:  (435, 256)\n",
      "num of points:  (435, 3)\n",
      "num of points after thresh:  (435, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  172 , inliers:  32 , percentage:  0.18604651162790697\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  290 , inliers:  209 , percentage:  0.7206896551724138\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  165 , inliers:  66 , percentage:  0.4\n",
      "num of points:  (264, 256)\n",
      "num of points after thresh:  (264, 256)\n",
      "num of points:  (264, 3)\n",
      "num of points after thresh:  (264, 3)\n",
      "num of points:  (303, 256)\n",
      "num of points after thresh:  (303, 256)\n",
      "num of points:  (303, 3)\n",
      "num of points after thresh:  (303, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  143 , inliers:  101 , percentage:  0.7062937062937062\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  149 , inliers:  74 , percentage:  0.4966442953020134\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "num of points:  (419, 256)\n",
      "num of points after thresh:  (419, 256)\n",
      "num of points:  (419, 3)\n",
      "num of points after thresh:  (419, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  186 , inliers:  97 , percentage:  0.521505376344086\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  128 , inliers:  23 , percentage:  0.1796875\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "num of points:  (281, 256)\n",
      "num of points after thresh:  (281, 256)\n",
      "num of points:  (281, 3)\n",
      "num of points after thresh:  (281, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  154 , inliers:  111 , percentage:  0.7207792207792207\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  152 , inliers:  52 , percentage:  0.34210526315789475\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "num of points:  (490, 256)\n",
      "num of points after thresh:  (490, 256)\n",
      "num of points:  (490, 3)\n",
      "num of points after thresh:  (490, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  170 , inliers:  49 , percentage:  0.28823529411764703\n",
      "num of points:  (288, 256)\n",
      "num of points after thresh:  (288, 256)\n",
      "num of points:  (288, 3)\n",
      "num of points after thresh:  (288, 3)\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  143 , percentage:  0.7988826815642458\n",
      "num of points:  (237, 256)\n",
      "num of points after thresh:  (237, 256)\n",
      "num of points:  (237, 3)\n",
      "num of points after thresh:  (237, 3)\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  110 , inliers:  54 , percentage:  0.4909090909090909\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  139 , inliers:  7 , percentage:  0.050359712230215826\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (524, 256)\n",
      "num of points after thresh:  (524, 256)\n",
      "num of points:  (524, 3)\n",
      "num of points after thresh:  (524, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  168 , inliers:  19 , percentage:  0.1130952380952381\n",
      "num of points:  (304, 256)\n",
      "num of points after thresh:  (304, 256)\n",
      "num of points:  (304, 3)\n",
      "num of points after thresh:  (304, 3)\n",
      "num of points:  (295, 256)\n",
      "num of points after thresh:  (295, 256)\n",
      "num of points:  (295, 3)\n",
      "num of points after thresh:  (295, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  219 , inliers:  173 , percentage:  0.7899543378995434\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "num of points:  (365, 256)\n",
      "num of points after thresh:  (365, 256)\n",
      "num of points:  (365, 3)\n",
      "num of points after thresh:  (365, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  176 , inliers:  101 , percentage:  0.5738636363636364\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "num of points:  (405, 256)\n",
      "num of points after thresh:  (405, 256)\n",
      "num of points:  (405, 3)\n",
      "num of points after thresh:  (405, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  278 , inliers:  253 , percentage:  0.9100719424460432\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  142 , inliers:  81 , percentage:  0.5704225352112676\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "num of points:  (314, 256)\n",
      "num of points after thresh:  (314, 256)\n",
      "num of points:  (314, 3)\n",
      "num of points after thresh:  (314, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  156 , inliers:  99 , percentage:  0.6346153846153846\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  269 , inliers:  155 , percentage:  0.5762081784386617\n",
      "num of points:  (237, 256)\n",
      "num of points after thresh:  (237, 256)\n",
      "num of points:  (237, 3)\n",
      "num of points after thresh:  (237, 3)\n",
      "num of points:  (319, 256)\n",
      "num of points after thresh:  (319, 256)\n",
      "num of points:  (319, 3)\n",
      "num of points after thresh:  (319, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  90 , inliers:  23 , percentage:  0.25555555555555554\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  284 , inliers:  232 , percentage:  0.8169014084507042\n",
      "num of points:  (577, 256)\n",
      "num of points after thresh:  (577, 256)\n",
      "num of points:  (577, 3)\n",
      "num of points after thresh:  (577, 3)\n",
      "num of points:  (580, 256)\n",
      "num of points after thresh:  (580, 256)\n",
      "num of points:  (580, 3)\n",
      "num of points after thresh:  (580, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  286 , inliers:  192 , percentage:  0.6713286713286714\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  376 , inliers:  360 , percentage:  0.9574468085106383\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  257 , inliers:  161 , percentage:  0.6264591439688716\n",
      "num of points:  (278, 256)\n",
      "num of points after thresh:  (278, 256)\n",
      "num of points:  (278, 3)\n",
      "num of points after thresh:  (278, 3)\n",
      "num of points:  (276, 256)\n",
      "num of points after thresh:  (276, 256)\n",
      "num of points:  (276, 3)\n",
      "num of points after thresh:  (276, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  245 , inliers:  236 , percentage:  0.963265306122449\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  306 , inliers:  263 , percentage:  0.8594771241830066\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "num of points:  (342, 256)\n",
      "num of points after thresh:  (342, 256)\n",
      "num of points:  (342, 3)\n",
      "num of points after thresh:  (342, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  228 , inliers:  199 , percentage:  0.8728070175438597\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (531, 256)\n",
      "num of points after thresh:  (531, 256)\n",
      "num of points:  (531, 3)\n",
      "num of points after thresh:  (531, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  211 , inliers:  134 , percentage:  0.6350710900473934\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "num of points:  (432, 256)\n",
      "num of points after thresh:  (432, 256)\n",
      "num of points:  (432, 3)\n",
      "num of points after thresh:  (432, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  243 , inliers:  151 , percentage:  0.6213991769547325\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "num of points:  (434, 256)\n",
      "num of points after thresh:  (434, 256)\n",
      "num of points:  (434, 3)\n",
      "num of points after thresh:  (434, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  185 , inliers:  107 , percentage:  0.5783783783783784\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  9 , percentage:  0.054878048780487805\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  146 , inliers:  55 , percentage:  0.3767123287671233\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (351, 256)\n",
      "num of points after thresh:  (351, 256)\n",
      "num of points:  (351, 3)\n",
      "num of points after thresh:  (351, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  218 , inliers:  154 , percentage:  0.7064220183486238\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  302 , inliers:  262 , percentage:  0.8675496688741722\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "num of points:  (490, 256)\n",
      "num of points after thresh:  (490, 256)\n",
      "num of points:  (490, 3)\n",
      "num of points after thresh:  (490, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  140 , inliers:  6 , percentage:  0.04285714285714286\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (395, 256)\n",
      "num of points after thresh:  (395, 256)\n",
      "num of points:  (395, 3)\n",
      "num of points after thresh:  (395, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  284 , inliers:  222 , percentage:  0.7816901408450704\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (491, 256)\n",
      "num of points after thresh:  (491, 256)\n",
      "num of points:  (491, 3)\n",
      "num of points after thresh:  (491, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  276 , inliers:  188 , percentage:  0.6811594202898551\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  238 , inliers:  175 , percentage:  0.7352941176470589\n",
      "num of points:  (218, 256)\n",
      "num of points after thresh:  (218, 256)\n",
      "num of points:  (218, 3)\n",
      "num of points after thresh:  (218, 3)\n",
      "num of points:  (219, 256)\n",
      "num of points after thresh:  (219, 256)\n",
      "num of points:  (219, 3)\n",
      "num of points after thresh:  (219, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  151 , inliers:  136 , percentage:  0.9006622516556292\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  200 , inliers:  126 , percentage:  0.63\n",
      "num of points:  (577, 256)\n",
      "num of points after thresh:  (577, 256)\n",
      "num of points:  (577, 3)\n",
      "num of points after thresh:  (577, 3)\n",
      "num of points:  (576, 256)\n",
      "num of points after thresh:  (576, 256)\n",
      "num of points:  (576, 3)\n",
      "num of points after thresh:  (576, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  173 , inliers:  32 , percentage:  0.18497109826589594\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  155 , inliers:  57 , percentage:  0.36774193548387096\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  186 , inliers:  140 , percentage:  0.7526881720430108\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  182 , inliers:  111 , percentage:  0.6098901098901099\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "num of points:  (353, 256)\n",
      "num of points after thresh:  (353, 256)\n",
      "num of points:  (353, 3)\n",
      "num of points after thresh:  (353, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  73 , percentage:  0.4866666666666667\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  370 , inliers:  332 , percentage:  0.8972972972972973\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  272 , inliers:  247 , percentage:  0.9080882352941176\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "num of points:  (313, 256)\n",
      "num of points after thresh:  (313, 256)\n",
      "num of points:  (313, 3)\n",
      "num of points after thresh:  (313, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  98 , percentage:  0.5536723163841808\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "num of points:  (320, 256)\n",
      "num of points after thresh:  (320, 256)\n",
      "num of points:  (320, 3)\n",
      "num of points after thresh:  (320, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  116 , inliers:  59 , percentage:  0.5086206896551724\n",
      "num of points:  (279, 256)\n",
      "num of points after thresh:  (279, 256)\n",
      "num of points:  (279, 3)\n",
      "num of points after thresh:  (279, 3)\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  101 , inliers:  8 , percentage:  0.07920792079207921\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "num of points:  (473, 256)\n",
      "num of points after thresh:  (473, 256)\n",
      "num of points:  (473, 3)\n",
      "num of points after thresh:  (473, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  246 , inliers:  168 , percentage:  0.6829268292682927\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  333 , inliers:  303 , percentage:  0.9099099099099099\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "num of points:  (455, 256)\n",
      "num of points after thresh:  (455, 256)\n",
      "num of points:  (455, 3)\n",
      "num of points after thresh:  (455, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  243 , inliers:  148 , percentage:  0.6090534979423868\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "num of points:  (317, 256)\n",
      "num of points after thresh:  (317, 256)\n",
      "num of points:  (317, 3)\n",
      "num of points after thresh:  (317, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  206 , inliers:  166 , percentage:  0.8058252427184466\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  159 , inliers:  83 , percentage:  0.5220125786163522\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "num of points:  (351, 256)\n",
      "num of points after thresh:  (351, 256)\n",
      "num of points:  (351, 3)\n",
      "num of points after thresh:  (351, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  214 , inliers:  180 , percentage:  0.8411214953271028\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  232 , inliers:  155 , percentage:  0.6681034482758621\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  282 , inliers:  255 , percentage:  0.9042553191489362\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "num of points:  (475, 256)\n",
      "num of points after thresh:  (475, 256)\n",
      "num of points:  (475, 3)\n",
      "num of points after thresh:  (475, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  381 , inliers:  350 , percentage:  0.9186351706036745\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "num of points:  (491, 256)\n",
      "num of points after thresh:  (491, 256)\n",
      "num of points:  (491, 3)\n",
      "num of points after thresh:  (491, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  263 , inliers:  209 , percentage:  0.7946768060836502\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "num of points:  (339, 256)\n",
      "num of points after thresh:  (339, 256)\n",
      "num of points:  (339, 3)\n",
      "num of points after thresh:  (339, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  195 , inliers:  141 , percentage:  0.7230769230769231\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  253 , inliers:  201 , percentage:  0.7944664031620553\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "num of points:  (338, 256)\n",
      "num of points after thresh:  (338, 256)\n",
      "num of points:  (338, 3)\n",
      "num of points after thresh:  (338, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  117 , inliers:  53 , percentage:  0.452991452991453\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  221 , inliers:  123 , percentage:  0.5565610859728507\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "use opencv estimation for inliers\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total matches:  120 , inliers:  14 , percentage:  0.11666666666666667\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  243 , inliers:  199 , percentage:  0.8189300411522634\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "num of points:  (340, 256)\n",
      "num of points after thresh:  (340, 256)\n",
      "num of points:  (340, 3)\n",
      "num of points after thresh:  (340, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  123 , inliers:  21 , percentage:  0.17073170731707318\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  282 , inliers:  209 , percentage:  0.7411347517730497\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  149 , inliers:  57 , percentage:  0.3825503355704698\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  254 , inliers:  242 , percentage:  0.952755905511811\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (465, 256)\n",
      "num of points after thresh:  (465, 256)\n",
      "num of points:  (465, 3)\n",
      "num of points after thresh:  (465, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  236 , inliers:  176 , percentage:  0.7457627118644068\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "num of points:  (500, 256)\n",
      "num of points after thresh:  (500, 256)\n",
      "num of points:  (500, 3)\n",
      "num of points after thresh:  (500, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  298 , inliers:  220 , percentage:  0.738255033557047\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (407, 256)\n",
      "num of points after thresh:  (407, 256)\n",
      "num of points:  (407, 3)\n",
      "num of points after thresh:  (407, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  233 , inliers:  171 , percentage:  0.7339055793991416\n",
      "num of points:  (358, 256)\n",
      "num of points after thresh:  (358, 256)\n",
      "num of points:  (358, 3)\n",
      "num of points after thresh:  (358, 3)\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  155 , inliers:  96 , percentage:  0.6193548387096774\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  154 , inliers:  55 , percentage:  0.35714285714285715\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "num of points:  (508, 256)\n",
      "num of points after thresh:  (508, 256)\n",
      "num of points:  (508, 3)\n",
      "num of points after thresh:  (508, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  186 , inliers:  82 , percentage:  0.44086021505376344\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (406, 256)\n",
      "num of points after thresh:  (406, 256)\n",
      "num of points:  (406, 3)\n",
      "num of points after thresh:  (406, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  175 , inliers:  102 , percentage:  0.5828571428571429\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "num of points:  (532, 256)\n",
      "num of points after thresh:  (532, 256)\n",
      "num of points:  (532, 3)\n",
      "num of points after thresh:  (532, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  199 , inliers:  103 , percentage:  0.5175879396984925\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "num of points:  (461, 256)\n",
      "num of points after thresh:  (461, 256)\n",
      "num of points:  (461, 3)\n",
      "num of points after thresh:  (461, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  180 , inliers:  79 , percentage:  0.4388888888888889\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  89 , inliers:  12 , percentage:  0.1348314606741573\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "num of points:  (482, 256)\n",
      "num of points after thresh:  (482, 256)\n",
      "num of points:  (482, 3)\n",
      "num of points after thresh:  (482, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  215 , inliers:  118 , percentage:  0.5488372093023256\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (348, 256)\n",
      "num of points after thresh:  (348, 256)\n",
      "num of points:  (348, 3)\n",
      "num of points after thresh:  (348, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  162 , inliers:  96 , percentage:  0.5925925925925926\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (423, 256)\n",
      "num of points after thresh:  (423, 256)\n",
      "num of points:  (423, 3)\n",
      "num of points after thresh:  (423, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  222 , inliers:  156 , percentage:  0.7027027027027027\n",
      "num of points:  (345, 256)\n",
      "num of points after thresh:  (345, 256)\n",
      "num of points:  (345, 3)\n",
      "num of points after thresh:  (345, 3)\n",
      "num of points:  (371, 256)\n",
      "num of points after thresh:  (371, 256)\n",
      "num of points:  (371, 3)\n",
      "num of points after thresh:  (371, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  205 , inliers:  160 , percentage:  0.7804878048780488\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  325 , inliers:  284 , percentage:  0.8738461538461538\n",
      "num of points:  (335, 256)\n",
      "num of points after thresh:  (335, 256)\n",
      "num of points:  (335, 3)\n",
      "num of points after thresh:  (335, 3)\n",
      "num of points:  (333, 256)\n",
      "num of points after thresh:  (333, 256)\n",
      "num of points:  (333, 3)\n",
      "num of points after thresh:  (333, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  217 , inliers:  202 , percentage:  0.9308755760368663\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  247 , inliers:  165 , percentage:  0.6680161943319838\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  212 , inliers:  177 , percentage:  0.8349056603773585\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "num of points:  (324, 256)\n",
      "num of points after thresh:  (324, 256)\n",
      "num of points:  (324, 3)\n",
      "num of points after thresh:  (324, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  146 , inliers:  87 , percentage:  0.5958904109589042\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "num of points:  (327, 256)\n",
      "num of points after thresh:  (327, 256)\n",
      "num of points:  (327, 3)\n",
      "num of points after thresh:  (327, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  194 , inliers:  145 , percentage:  0.7474226804123711\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  258 , inliers:  198 , percentage:  0.7674418604651163\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "num of points:  (339, 256)\n",
      "num of points after thresh:  (339, 256)\n",
      "num of points:  (339, 3)\n",
      "num of points after thresh:  (339, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  155 , inliers:  65 , percentage:  0.41935483870967744\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  282 , inliers:  230 , percentage:  0.8156028368794326\n",
      "num of points:  (304, 256)\n",
      "num of points after thresh:  (304, 256)\n",
      "num of points:  (304, 3)\n",
      "num of points after thresh:  (304, 3)\n",
      "num of points:  (293, 256)\n",
      "num of points after thresh:  (293, 256)\n",
      "num of points:  (293, 3)\n",
      "num of points after thresh:  (293, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  174 , inliers:  127 , percentage:  0.7298850574712644\n",
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  37 , percentage:  0.2624113475177305\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (483, 256)\n",
      "num of points after thresh:  (483, 256)\n",
      "num of points:  (483, 3)\n",
      "num of points after thresh:  (483, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  84 , percentage:  0.4692737430167598\n",
      "num of points:  (577, 256)\n",
      "num of points after thresh:  (577, 256)\n",
      "num of points:  (577, 3)\n",
      "num of points after thresh:  (577, 3)\n",
      "num of points:  (499, 256)\n",
      "num of points after thresh:  (499, 256)\n",
      "num of points:  (499, 3)\n",
      "num of points after thresh:  (499, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  190 , inliers:  38 , percentage:  0.2\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "num of points:  (404, 256)\n",
      "num of points after thresh:  (404, 256)\n",
      "num of points:  (404, 3)\n",
      "num of points after thresh:  (404, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  171 , inliers:  79 , percentage:  0.4619883040935672\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (435, 256)\n",
      "num of points after thresh:  (435, 256)\n",
      "num of points:  (435, 3)\n",
      "num of points after thresh:  (435, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  170 , inliers:  92 , percentage:  0.5411764705882353\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  254 , inliers:  175 , percentage:  0.6889763779527559\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "num of points:  (346, 256)\n",
      "num of points after thresh:  (346, 256)\n",
      "num of points:  (346, 3)\n",
      "num of points after thresh:  (346, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  257 , inliers:  223 , percentage:  0.867704280155642\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (537, 256)\n",
      "num of points after thresh:  (537, 256)\n",
      "num of points:  (537, 3)\n",
      "num of points after thresh:  (537, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  294 , inliers:  235 , percentage:  0.7993197278911565\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "num of points:  (387, 256)\n",
      "num of points after thresh:  (387, 256)\n",
      "num of points:  (387, 3)\n",
      "num of points after thresh:  (387, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  131 , inliers:  6 , percentage:  0.04580152671755725\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  241 , inliers:  158 , percentage:  0.6556016597510373\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "num of points:  (434, 256)\n",
      "num of points after thresh:  (434, 256)\n",
      "num of points:  (434, 3)\n",
      "num of points after thresh:  (434, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  381 , inliers:  366 , percentage:  0.9606299212598425\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "num of points:  (371, 256)\n",
      "num of points after thresh:  (371, 256)\n",
      "num of points:  (371, 3)\n",
      "num of points after thresh:  (371, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  168 , inliers:  76 , percentage:  0.4523809523809524\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  278 , inliers:  228 , percentage:  0.8201438848920863\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  171 , inliers:  140 , percentage:  0.8187134502923976\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (392, 256)\n",
      "num of points after thresh:  (392, 256)\n",
      "num of points:  (392, 3)\n",
      "num of points after thresh:  (392, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  187 , inliers:  106 , percentage:  0.5668449197860963\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (405, 256)\n",
      "num of points after thresh:  (405, 256)\n",
      "num of points:  (405, 3)\n",
      "num of points after thresh:  (405, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  276 , inliers:  222 , percentage:  0.8043478260869565\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  156 , inliers:  107 , percentage:  0.6858974358974359\n",
      "num of points:  (542, 256)\n",
      "num of points after thresh:  (542, 256)\n",
      "num of points:  (542, 3)\n",
      "num of points after thresh:  (542, 3)\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  198 , inliers:  94 , percentage:  0.47474747474747475\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "num of points:  (387, 256)\n",
      "num of points after thresh:  (387, 256)\n",
      "num of points:  (387, 3)\n",
      "num of points after thresh:  (387, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  210 , inliers:  125 , percentage:  0.5952380952380952\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  276 , inliers:  210 , percentage:  0.7608695652173914\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "num of points:  (269, 256)\n",
      "num of points after thresh:  (269, 256)\n",
      "num of points:  (269, 3)\n",
      "num of points after thresh:  (269, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  122 , inliers:  50 , percentage:  0.4098360655737705\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "num of points:  (515, 256)\n",
      "num of points after thresh:  (515, 256)\n",
      "num of points:  (515, 3)\n",
      "num of points after thresh:  (515, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  256 , inliers:  160 , percentage:  0.625\n",
      "num of points:  (523, 256)\n",
      "num of points after thresh:  (523, 256)\n",
      "num of points:  (523, 3)\n",
      "num of points after thresh:  (523, 3)\n",
      "num of points:  (488, 256)\n",
      "num of points after thresh:  (488, 256)\n",
      "num of points:  (488, 3)\n",
      "num of points after thresh:  (488, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  213 , inliers:  78 , percentage:  0.36619718309859156\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "num of points:  (423, 256)\n",
      "num of points after thresh:  (423, 256)\n",
      "num of points:  (423, 3)\n",
      "num of points after thresh:  (423, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  57 , percentage:  0.36075949367088606\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  282 , inliers:  218 , percentage:  0.7730496453900709\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "num of points:  (424, 256)\n",
      "num of points after thresh:  (424, 256)\n",
      "num of points:  (424, 3)\n",
      "num of points after thresh:  (424, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  329 , inliers:  301 , percentage:  0.9148936170212766\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  212 , inliers:  153 , percentage:  0.7216981132075472\n",
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "num of points:  (402, 256)\n",
      "num of points after thresh:  (402, 256)\n",
      "num of points:  (402, 3)\n",
      "num of points after thresh:  (402, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  147 , inliers:  68 , percentage:  0.46258503401360546\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "num of points:  (439, 256)\n",
      "num of points after thresh:  (439, 256)\n",
      "num of points:  (439, 3)\n",
      "num of points after thresh:  (439, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  155 , percentage:  0.670995670995671\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  200 , inliers:  124 , percentage:  0.62\n",
      "num of points:  (242, 256)\n",
      "num of points after thresh:  (242, 256)\n",
      "num of points:  (242, 3)\n",
      "num of points after thresh:  (242, 3)\n",
      "num of points:  (234, 256)\n",
      "num of points after thresh:  (234, 256)\n",
      "num of points:  (234, 3)\n",
      "num of points after thresh:  (234, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  137 , percentage:  0.7740112994350282\n",
      "num of points:  (328, 256)\n",
      "num of points after thresh:  (328, 256)\n",
      "num of points:  (328, 3)\n",
      "num of points after thresh:  (328, 3)\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  190 , percentage:  0.7251908396946565\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (501, 256)\n",
      "num of points after thresh:  (501, 256)\n",
      "num of points:  (501, 3)\n",
      "num of points after thresh:  (501, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  314 , inliers:  255 , percentage:  0.8121019108280255\n",
      "num of points:  (528, 256)\n",
      "num of points after thresh:  (528, 256)\n",
      "num of points:  (528, 3)\n",
      "num of points after thresh:  (528, 3)\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  204 , inliers:  98 , percentage:  0.4803921568627451\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (398, 256)\n",
      "num of points after thresh:  (398, 256)\n",
      "num of points:  (398, 3)\n",
      "num of points after thresh:  (398, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  167 , inliers:  86 , percentage:  0.5149700598802395\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  222 , inliers:  114 , percentage:  0.5135135135135135\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  308 , inliers:  287 , percentage:  0.9318181818181818\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "num of points:  (363, 256)\n",
      "num of points after thresh:  (363, 256)\n",
      "num of points:  (363, 3)\n",
      "num of points after thresh:  (363, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  173 , inliers:  66 , percentage:  0.3815028901734104\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "num of points:  (407, 256)\n",
      "num of points after thresh:  (407, 256)\n",
      "num of points:  (407, 3)\n",
      "num of points after thresh:  (407, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  215 , inliers:  165 , percentage:  0.7674418604651163\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  325 , inliers:  266 , percentage:  0.8184615384615385\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  256 , inliers:  184 , percentage:  0.71875\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "num of points:  (409, 256)\n",
      "num of points after thresh:  (409, 256)\n",
      "num of points:  (409, 3)\n",
      "num of points after thresh:  (409, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  147 , inliers:  7 , percentage:  0.047619047619047616\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  203 , inliers:  134 , percentage:  0.6600985221674877\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "num of points:  (386, 256)\n",
      "num of points after thresh:  (386, 256)\n",
      "num of points:  (386, 3)\n",
      "num of points after thresh:  (386, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  261 , inliers:  225 , percentage:  0.8620689655172413\n",
      "num of points:  (336, 256)\n",
      "num of points after thresh:  (336, 256)\n",
      "num of points:  (336, 3)\n",
      "num of points after thresh:  (336, 3)\n",
      "num of points:  (341, 256)\n",
      "num of points after thresh:  (341, 256)\n",
      "num of points:  (341, 3)\n",
      "num of points after thresh:  (341, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  291 , inliers:  267 , percentage:  0.9175257731958762\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "num of points:  (350, 256)\n",
      "num of points after thresh:  (350, 256)\n",
      "num of points:  (350, 3)\n",
      "num of points after thresh:  (350, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  188 , inliers:  102 , percentage:  0.5425531914893617\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (378, 256)\n",
      "num of points after thresh:  (378, 256)\n",
      "num of points:  (378, 3)\n",
      "num of points after thresh:  (378, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  280 , inliers:  236 , percentage:  0.8428571428571429\n",
      "num of points:  (528, 256)\n",
      "num of points after thresh:  (528, 256)\n",
      "num of points:  (528, 3)\n",
      "num of points after thresh:  (528, 3)\n",
      "num of points:  (503, 256)\n",
      "num of points after thresh:  (503, 256)\n",
      "num of points:  (503, 3)\n",
      "num of points after thresh:  (503, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  240 , inliers:  152 , percentage:  0.6333333333333333\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  119 , inliers:  7 , percentage:  0.058823529411764705\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  244 , inliers:  207 , percentage:  0.8483606557377049\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "num of points:  (366, 256)\n",
      "num of points after thresh:  (366, 256)\n",
      "num of points:  (366, 3)\n",
      "num of points after thresh:  (366, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  244 , inliers:  158 , percentage:  0.6475409836065574\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "num of points:  (220, 256)\n",
      "num of points after thresh:  (220, 256)\n",
      "num of points:  (220, 3)\n",
      "num of points after thresh:  (220, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  113 , inliers:  43 , percentage:  0.3805309734513274\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  299 , inliers:  253 , percentage:  0.8461538461538461\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "num of points:  (490, 256)\n",
      "num of points after thresh:  (490, 256)\n",
      "num of points:  (490, 3)\n",
      "num of points after thresh:  (490, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  161 , inliers:  49 , percentage:  0.30434782608695654\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "num of points:  (341, 256)\n",
      "num of points after thresh:  (341, 256)\n",
      "num of points:  (341, 3)\n",
      "num of points after thresh:  (341, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  129 , inliers:  62 , percentage:  0.4806201550387597\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  162 , inliers:  23 , percentage:  0.1419753086419753\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  119 , percentage:  0.672316384180791\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  133 , inliers:  17 , percentage:  0.12781954887218044\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "num of points:  (348, 256)\n",
      "num of points after thresh:  (348, 256)\n",
      "num of points:  (348, 3)\n",
      "num of points after thresh:  (348, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  103 , inliers:  21 , percentage:  0.20388349514563106\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  135 , percentage:  0.7541899441340782\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  274 , inliers:  220 , percentage:  0.8029197080291971\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "num of points:  (430, 256)\n",
      "num of points after thresh:  (430, 256)\n",
      "num of points:  (430, 3)\n",
      "num of points after thresh:  (430, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  8 , percentage:  0.05333333333333334\n",
      "num of points:  (542, 256)\n",
      "num of points after thresh:  (542, 256)\n",
      "num of points:  (542, 3)\n",
      "num of points after thresh:  (542, 3)\n",
      "num of points:  (466, 256)\n",
      "num of points after thresh:  (466, 256)\n",
      "num of points:  (466, 3)\n",
      "num of points after thresh:  (466, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  182 , inliers:  60 , percentage:  0.32967032967032966\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (510, 256)\n",
      "num of points after thresh:  (510, 256)\n",
      "num of points:  (510, 3)\n",
      "num of points after thresh:  (510, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  248 , inliers:  153 , percentage:  0.6169354838709677\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  199 , inliers:  165 , percentage:  0.8291457286432161\n",
      "num of points:  (440, 256)\n",
      "num of points after thresh:  (440, 256)\n",
      "num of points:  (440, 3)\n",
      "num of points after thresh:  (440, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  172 , percentage:  0.7445887445887446\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  200 , inliers:  137 , percentage:  0.685\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "num of points:  (366, 256)\n",
      "num of points after thresh:  (366, 256)\n",
      "num of points:  (366, 3)\n",
      "num of points after thresh:  (366, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  142 , inliers:  41 , percentage:  0.2887323943661972\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "num of points:  (326, 256)\n",
      "num of points after thresh:  (326, 256)\n",
      "num of points:  (326, 3)\n",
      "num of points after thresh:  (326, 3)\n",
      "use opencv estimation for inliers\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total matches:  119 , inliers:  10 , percentage:  0.08403361344537816\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  191 , inliers:  122 , percentage:  0.6387434554973822\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "num of points:  (399, 256)\n",
      "num of points after thresh:  (399, 256)\n",
      "num of points:  (399, 3)\n",
      "num of points after thresh:  (399, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  304 , inliers:  283 , percentage:  0.930921052631579\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "num of points:  (366, 256)\n",
      "num of points after thresh:  (366, 256)\n",
      "num of points:  (366, 3)\n",
      "num of points after thresh:  (366, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  27 , percentage:  0.19148936170212766\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "num of points:  (271, 256)\n",
      "num of points after thresh:  (271, 256)\n",
      "num of points:  (271, 3)\n",
      "num of points after thresh:  (271, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  94 , inliers:  26 , percentage:  0.2765957446808511\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "num of points:  (466, 256)\n",
      "num of points after thresh:  (466, 256)\n",
      "num of points:  (466, 3)\n",
      "num of points after thresh:  (466, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  402 , inliers:  375 , percentage:  0.9328358208955224\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  192 , inliers:  112 , percentage:  0.5833333333333334\n",
      "num of points:  (343, 256)\n",
      "num of points after thresh:  (343, 256)\n",
      "num of points:  (343, 3)\n",
      "num of points after thresh:  (343, 3)\n",
      "num of points:  (351, 256)\n",
      "num of points after thresh:  (351, 256)\n",
      "num of points:  (351, 3)\n",
      "num of points after thresh:  (351, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  127 , inliers:  63 , percentage:  0.49606299212598426\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  106 , inliers:  26 , percentage:  0.24528301886792453\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  135 , percentage:  0.7142857142857143\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  166 , inliers:  106 , percentage:  0.6385542168674698\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (555, 256)\n",
      "num of points after thresh:  (555, 256)\n",
      "num of points:  (555, 3)\n",
      "num of points after thresh:  (555, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  257 , inliers:  174 , percentage:  0.6770428015564203\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (524, 256)\n",
      "num of points after thresh:  (524, 256)\n",
      "num of points:  (524, 3)\n",
      "num of points after thresh:  (524, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  408 , inliers:  375 , percentage:  0.9191176470588235\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  297 , inliers:  240 , percentage:  0.8080808080808081\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "num of points:  (489, 256)\n",
      "num of points after thresh:  (489, 256)\n",
      "num of points:  (489, 3)\n",
      "num of points after thresh:  (489, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  235 , inliers:  148 , percentage:  0.6297872340425532\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "num of points:  (408, 256)\n",
      "num of points after thresh:  (408, 256)\n",
      "num of points:  (408, 3)\n",
      "num of points after thresh:  (408, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  255 , inliers:  198 , percentage:  0.7764705882352941\n",
      "num of points:  (288, 256)\n",
      "num of points after thresh:  (288, 256)\n",
      "num of points:  (288, 3)\n",
      "num of points after thresh:  (288, 3)\n",
      "num of points:  (399, 256)\n",
      "num of points after thresh:  (399, 256)\n",
      "num of points:  (399, 3)\n",
      "num of points after thresh:  (399, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  124 , inliers:  39 , percentage:  0.31451612903225806\n",
      "num of points:  (382, 256)\n",
      "num of points after thresh:  (382, 256)\n",
      "num of points:  (382, 3)\n",
      "num of points after thresh:  (382, 3)\n",
      "num of points:  (426, 256)\n",
      "num of points after thresh:  (426, 256)\n",
      "num of points:  (426, 3)\n",
      "num of points after thresh:  (426, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  191 , inliers:  108 , percentage:  0.5654450261780105\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  224 , inliers:  152 , percentage:  0.6785714285714286\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  189 , inliers:  90 , percentage:  0.47619047619047616\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "num of points:  (346, 256)\n",
      "num of points after thresh:  (346, 256)\n",
      "num of points:  (346, 3)\n",
      "num of points after thresh:  (346, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  113 , inliers:  35 , percentage:  0.30973451327433627\n",
      "num of points:  (440, 256)\n",
      "num of points after thresh:  (440, 256)\n",
      "num of points:  (440, 3)\n",
      "num of points after thresh:  (440, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  214 , inliers:  147 , percentage:  0.6869158878504673\n",
      "num of points:  (318, 256)\n",
      "num of points after thresh:  (318, 256)\n",
      "num of points:  (318, 3)\n",
      "num of points after thresh:  (318, 3)\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  119 , inliers:  15 , percentage:  0.12605042016806722\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "num of points:  (363, 256)\n",
      "num of points after thresh:  (363, 256)\n",
      "num of points:  (363, 3)\n",
      "num of points after thresh:  (363, 3)\n",
      "use opencv estimation for inliers\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total matches:  164 , inliers:  82 , percentage:  0.5\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "num of points:  (281, 256)\n",
      "num of points after thresh:  (281, 256)\n",
      "num of points:  (281, 3)\n",
      "num of points after thresh:  (281, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  143 , inliers:  81 , percentage:  0.5664335664335665\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "num of points:  (357, 256)\n",
      "num of points after thresh:  (357, 256)\n",
      "num of points:  (357, 3)\n",
      "num of points after thresh:  (357, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  309 , inliers:  306 , percentage:  0.9902912621359223\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  268 , inliers:  140 , percentage:  0.5223880597014925\n",
      "num of points:  (304, 256)\n",
      "num of points after thresh:  (304, 256)\n",
      "num of points:  (304, 3)\n",
      "num of points after thresh:  (304, 3)\n",
      "num of points:  (250, 256)\n",
      "num of points after thresh:  (250, 256)\n",
      "num of points:  (250, 3)\n",
      "num of points after thresh:  (250, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  134 , inliers:  60 , percentage:  0.44776119402985076\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  230 , inliers:  197 , percentage:  0.8565217391304348\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "num of points:  (339, 256)\n",
      "num of points after thresh:  (339, 256)\n",
      "num of points:  (339, 3)\n",
      "num of points after thresh:  (339, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  140 , inliers:  49 , percentage:  0.35\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "num of points:  (424, 256)\n",
      "num of points after thresh:  (424, 256)\n",
      "num of points:  (424, 3)\n",
      "num of points after thresh:  (424, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  229 , percentage:  0.8740458015267175\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "num of points:  (363, 256)\n",
      "num of points after thresh:  (363, 256)\n",
      "num of points:  (363, 3)\n",
      "num of points after thresh:  (363, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  274 , inliers:  245 , percentage:  0.8941605839416058\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  187 , inliers:  131 , percentage:  0.7005347593582888\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  134 , inliers:  29 , percentage:  0.21641791044776118\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "num of points:  (482, 256)\n",
      "num of points after thresh:  (482, 256)\n",
      "num of points:  (482, 3)\n",
      "num of points after thresh:  (482, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  323 , inliers:  231 , percentage:  0.7151702786377709\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  272 , inliers:  245 , percentage:  0.9007352941176471\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (483, 256)\n",
      "num of points after thresh:  (483, 256)\n",
      "num of points:  (483, 3)\n",
      "num of points after thresh:  (483, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  291 , inliers:  230 , percentage:  0.7903780068728522\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  254 , inliers:  186 , percentage:  0.7322834645669292\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  356 , inliers:  255 , percentage:  0.7162921348314607\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  130 , inliers:  44 , percentage:  0.3384615384615385\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (419, 256)\n",
      "num of points after thresh:  (419, 256)\n",
      "num of points:  (419, 3)\n",
      "num of points after thresh:  (419, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  327 , inliers:  303 , percentage:  0.926605504587156\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "num of points:  (480, 256)\n",
      "num of points after thresh:  (480, 256)\n",
      "num of points:  (480, 3)\n",
      "num of points after thresh:  (480, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  303 , inliers:  241 , percentage:  0.7953795379537953\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "num of points:  (326, 256)\n",
      "num of points after thresh:  (326, 256)\n",
      "num of points:  (326, 3)\n",
      "num of points after thresh:  (326, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  139 , inliers:  59 , percentage:  0.4244604316546763\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "num of points:  (362, 256)\n",
      "num of points after thresh:  (362, 256)\n",
      "num of points:  (362, 3)\n",
      "num of points after thresh:  (362, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  251 , inliers:  169 , percentage:  0.6733067729083665\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "num of points:  (308, 256)\n",
      "num of points after thresh:  (308, 256)\n",
      "num of points:  (308, 3)\n",
      "num of points after thresh:  (308, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  171 , inliers:  124 , percentage:  0.7251461988304093\n",
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  201 , inliers:  94 , percentage:  0.46766169154228854\n",
      "num of points:  (245, 256)\n",
      "num of points after thresh:  (245, 256)\n",
      "num of points:  (245, 3)\n",
      "num of points after thresh:  (245, 3)\n",
      "num of points:  (246, 256)\n",
      "num of points after thresh:  (246, 256)\n",
      "num of points:  (246, 3)\n",
      "num of points after thresh:  (246, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  77 , inliers:  27 , percentage:  0.35064935064935066\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  322 , inliers:  248 , percentage:  0.7701863354037267\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "num of points:  (404, 256)\n",
      "num of points after thresh:  (404, 256)\n",
      "num of points:  (404, 3)\n",
      "num of points after thresh:  (404, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  331 , inliers:  313 , percentage:  0.945619335347432\n",
      "num of points:  (443, 256)\n",
      "num of points after thresh:  (443, 256)\n",
      "num of points:  (443, 3)\n",
      "num of points after thresh:  (443, 3)\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "use opencv estimation for inliers\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total matches:  135 , inliers:  6 , percentage:  0.044444444444444446\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (426, 256)\n",
      "num of points after thresh:  (426, 256)\n",
      "num of points:  (426, 3)\n",
      "num of points after thresh:  (426, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  203 , inliers:  138 , percentage:  0.6798029556650246\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  169 , inliers:  113 , percentage:  0.6686390532544378\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "num of points:  (465, 256)\n",
      "num of points after thresh:  (465, 256)\n",
      "num of points:  (465, 3)\n",
      "num of points after thresh:  (465, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  382 , inliers:  366 , percentage:  0.9581151832460733\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (432, 256)\n",
      "num of points after thresh:  (432, 256)\n",
      "num of points:  (432, 3)\n",
      "num of points after thresh:  (432, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  262 , inliers:  214 , percentage:  0.816793893129771\n",
      "num of points:  (372, 256)\n",
      "num of points after thresh:  (372, 256)\n",
      "num of points:  (372, 3)\n",
      "num of points after thresh:  (372, 3)\n",
      "num of points:  (366, 256)\n",
      "num of points after thresh:  (366, 256)\n",
      "num of points:  (366, 3)\n",
      "num of points after thresh:  (366, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  170 , inliers:  96 , percentage:  0.5647058823529412\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  225 , inliers:  204 , percentage:  0.9066666666666666\n",
      "num of points:  (418, 256)\n",
      "num of points after thresh:  (418, 256)\n",
      "num of points:  (418, 3)\n",
      "num of points after thresh:  (418, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  133 , inliers:  6 , percentage:  0.045112781954887216\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  54 , percentage:  0.34177215189873417\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  223 , inliers:  196 , percentage:  0.8789237668161435\n",
      "num of points:  (487, 256)\n",
      "num of points after thresh:  (487, 256)\n",
      "num of points:  (487, 3)\n",
      "num of points after thresh:  (487, 3)\n",
      "num of points:  (426, 256)\n",
      "num of points after thresh:  (426, 256)\n",
      "num of points:  (426, 3)\n",
      "num of points after thresh:  (426, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  210 , inliers:  137 , percentage:  0.6523809523809524\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  213 , inliers:  143 , percentage:  0.6713615023474179\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "num of points:  (362, 256)\n",
      "num of points after thresh:  (362, 256)\n",
      "num of points:  (362, 3)\n",
      "num of points after thresh:  (362, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  131 , inliers:  38 , percentage:  0.2900763358778626\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  268 , inliers:  227 , percentage:  0.8470149253731343\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "num of points:  (469, 256)\n",
      "num of points after thresh:  (469, 256)\n",
      "num of points:  (469, 3)\n",
      "num of points after thresh:  (469, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  214 , inliers:  125 , percentage:  0.5841121495327103\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "num of points:  (368, 256)\n",
      "num of points after thresh:  (368, 256)\n",
      "num of points:  (368, 3)\n",
      "num of points after thresh:  (368, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  144 , inliers:  55 , percentage:  0.3819444444444444\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "num of points:  (450, 256)\n",
      "num of points after thresh:  (450, 256)\n",
      "num of points:  (450, 3)\n",
      "num of points after thresh:  (450, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  156 , inliers:  39 , percentage:  0.25\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (409, 256)\n",
      "num of points after thresh:  (409, 256)\n",
      "num of points:  (409, 3)\n",
      "num of points after thresh:  (409, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  163 , percentage:  0.7056277056277056\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "num of points:  (467, 256)\n",
      "num of points after thresh:  (467, 256)\n",
      "num of points:  (467, 3)\n",
      "num of points after thresh:  (467, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  247 , inliers:  177 , percentage:  0.7165991902834008\n",
      "num of points:  (376, 256)\n",
      "num of points after thresh:  (376, 256)\n",
      "num of points:  (376, 3)\n",
      "num of points after thresh:  (376, 3)\n",
      "num of points:  (359, 256)\n",
      "num of points after thresh:  (359, 256)\n",
      "num of points:  (359, 3)\n",
      "num of points after thresh:  (359, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  141 , inliers:  29 , percentage:  0.20567375886524822\n",
      "num of points:  (242, 256)\n",
      "num of points after thresh:  (242, 256)\n",
      "num of points:  (242, 3)\n",
      "num of points after thresh:  (242, 3)\n",
      "num of points:  (236, 256)\n",
      "num of points after thresh:  (236, 256)\n",
      "num of points:  (236, 3)\n",
      "num of points after thresh:  (236, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  163 , inliers:  129 , percentage:  0.7914110429447853\n",
      "num of points:  (335, 256)\n",
      "num of points after thresh:  (335, 256)\n",
      "num of points:  (335, 3)\n",
      "num of points after thresh:  (335, 3)\n",
      "num of points:  (342, 256)\n",
      "num of points after thresh:  (342, 256)\n",
      "num of points:  (342, 3)\n",
      "num of points after thresh:  (342, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  211 , inliers:  196 , percentage:  0.9289099526066351\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  305 , inliers:  255 , percentage:  0.8360655737704918\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  186 , inliers:  79 , percentage:  0.42473118279569894\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  308 , inliers:  286 , percentage:  0.9285714285714286\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "num of points:  (475, 256)\n",
      "num of points after thresh:  (475, 256)\n",
      "num of points:  (475, 3)\n",
      "num of points after thresh:  (475, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  152 , inliers:  20 , percentage:  0.13157894736842105\n",
      "num of points:  (242, 256)\n",
      "num of points after thresh:  (242, 256)\n",
      "num of points:  (242, 3)\n",
      "num of points after thresh:  (242, 3)\n",
      "num of points:  (250, 256)\n",
      "num of points after thresh:  (250, 256)\n",
      "num of points:  (250, 3)\n",
      "num of points after thresh:  (250, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  154 , inliers:  105 , percentage:  0.6818181818181818\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  119 , inliers:  10 , percentage:  0.08403361344537816\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "num of points:  (450, 256)\n",
      "num of points after thresh:  (450, 256)\n",
      "num of points:  (450, 3)\n",
      "num of points after thresh:  (450, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  372 , inliers:  350 , percentage:  0.9408602150537635\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "num of points:  (480, 256)\n",
      "num of points after thresh:  (480, 256)\n",
      "num of points:  (480, 3)\n",
      "num of points after thresh:  (480, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  216 , inliers:  130 , percentage:  0.6018518518518519\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "num of points:  (366, 256)\n",
      "num of points after thresh:  (366, 256)\n",
      "num of points:  (366, 3)\n",
      "num of points after thresh:  (366, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  97 , percentage:  0.5480225988700564\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  193 , inliers:  112 , percentage:  0.5803108808290155\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  155 , inliers:  16 , percentage:  0.1032258064516129\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  152 , inliers:  7 , percentage:  0.046052631578947366\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  153 , inliers:  44 , percentage:  0.2875816993464052\n",
      "num of points:  (264, 256)\n",
      "num of points after thresh:  (264, 256)\n",
      "num of points:  (264, 3)\n",
      "num of points after thresh:  (264, 3)\n",
      "num of points:  (231, 256)\n",
      "num of points after thresh:  (231, 256)\n",
      "num of points:  (231, 3)\n",
      "num of points after thresh:  (231, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  148 , inliers:  98 , percentage:  0.6621621621621622\n",
      "num of points:  (242, 256)\n",
      "num of points after thresh:  (242, 256)\n",
      "num of points:  (242, 3)\n",
      "num of points after thresh:  (242, 3)\n",
      "num of points:  (320, 256)\n",
      "num of points after thresh:  (320, 256)\n",
      "num of points:  (320, 3)\n",
      "num of points after thresh:  (320, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  125 , inliers:  68 , percentage:  0.544\n",
      "num of points:  (542, 256)\n",
      "num of points after thresh:  (542, 256)\n",
      "num of points:  (542, 3)\n",
      "num of points after thresh:  (542, 3)\n",
      "num of points:  (546, 256)\n",
      "num of points after thresh:  (546, 256)\n",
      "num of points:  (546, 3)\n",
      "num of points after thresh:  (546, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  338 , inliers:  272 , percentage:  0.8047337278106509\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "num of points:  (300, 256)\n",
      "num of points after thresh:  (300, 256)\n",
      "num of points:  (300, 3)\n",
      "num of points after thresh:  (300, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  216 , inliers:  167 , percentage:  0.7731481481481481\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "num of points:  (458, 256)\n",
      "num of points after thresh:  (458, 256)\n",
      "num of points:  (458, 3)\n",
      "num of points after thresh:  (458, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  207 , inliers:  135 , percentage:  0.6521739130434783\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  135 , inliers:  48 , percentage:  0.35555555555555557\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "num of points:  (402, 256)\n",
      "num of points after thresh:  (402, 256)\n",
      "num of points:  (402, 3)\n",
      "num of points after thresh:  (402, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  305 , inliers:  222 , percentage:  0.7278688524590164\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "num of points:  (423, 256)\n",
      "num of points after thresh:  (423, 256)\n",
      "num of points:  (423, 3)\n",
      "num of points after thresh:  (423, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  210 , inliers:  153 , percentage:  0.7285714285714285\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (411, 256)\n",
      "num of points after thresh:  (411, 256)\n",
      "num of points:  (411, 3)\n",
      "num of points after thresh:  (411, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  293 , inliers:  258 , percentage:  0.8805460750853242\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "num of points:  (501, 256)\n",
      "num of points after thresh:  (501, 256)\n",
      "num of points:  (501, 3)\n",
      "num of points after thresh:  (501, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  352 , inliers:  278 , percentage:  0.7897727272727273\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  249 , inliers:  191 , percentage:  0.7670682730923695\n",
      "num of points:  (370, 256)\n",
      "num of points after thresh:  (370, 256)\n",
      "num of points:  (370, 3)\n",
      "num of points after thresh:  (370, 3)\n",
      "num of points:  (374, 256)\n",
      "num of points after thresh:  (374, 256)\n",
      "num of points:  (374, 3)\n",
      "num of points after thresh:  (374, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  253 , inliers:  205 , percentage:  0.8102766798418972\n",
      "num of points:  (245, 256)\n",
      "num of points after thresh:  (245, 256)\n",
      "num of points:  (245, 3)\n",
      "num of points after thresh:  (245, 3)\n",
      "num of points:  (224, 256)\n",
      "num of points after thresh:  (224, 256)\n",
      "num of points:  (224, 3)\n",
      "num of points after thresh:  (224, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  71 , inliers:  17 , percentage:  0.23943661971830985\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  151 , inliers:  82 , percentage:  0.543046357615894\n",
      "num of points:  (422, 256)\n",
      "num of points after thresh:  (422, 256)\n",
      "num of points:  (422, 3)\n",
      "num of points after thresh:  (422, 3)\n",
      "num of points:  (424, 256)\n",
      "num of points after thresh:  (424, 256)\n",
      "num of points:  (424, 3)\n",
      "num of points after thresh:  (424, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  291 , inliers:  230 , percentage:  0.7903780068728522\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "num of points:  (286, 256)\n",
      "num of points after thresh:  (286, 256)\n",
      "num of points:  (286, 3)\n",
      "num of points after thresh:  (286, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  145 , inliers:  98 , percentage:  0.6758620689655173\n",
      "num of points:  (380, 256)\n",
      "num of points after thresh:  (380, 256)\n",
      "num of points:  (380, 3)\n",
      "num of points after thresh:  (380, 3)\n",
      "num of points:  (347, 256)\n",
      "num of points after thresh:  (347, 256)\n",
      "num of points:  (347, 3)\n",
      "num of points after thresh:  (347, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  207 , inliers:  163 , percentage:  0.7874396135265701\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  244 , inliers:  148 , percentage:  0.6065573770491803\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "num of points:  (455, 256)\n",
      "num of points after thresh:  (455, 256)\n",
      "num of points:  (455, 3)\n",
      "num of points after thresh:  (455, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  181 , inliers:  83 , percentage:  0.4585635359116022\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (517, 256)\n",
      "num of points after thresh:  (517, 256)\n",
      "num of points:  (517, 3)\n",
      "num of points after thresh:  (517, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  356 , inliers:  255 , percentage:  0.7162921348314607\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "num of points:  (234, 256)\n",
      "num of points after thresh:  (234, 256)\n",
      "num of points:  (234, 3)\n",
      "num of points after thresh:  (234, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  78 , inliers:  13 , percentage:  0.16666666666666666\n",
      "num of points:  (318, 256)\n",
      "num of points after thresh:  (318, 256)\n",
      "num of points:  (318, 3)\n",
      "num of points after thresh:  (318, 3)\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  117 , inliers:  6 , percentage:  0.05128205128205128\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (524, 256)\n",
      "num of points after thresh:  (524, 256)\n",
      "num of points:  (524, 3)\n",
      "num of points after thresh:  (524, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  408 , inliers:  375 , percentage:  0.9191176470588235\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  260 , inliers:  192 , percentage:  0.7384615384615385\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (498, 256)\n",
      "num of points after thresh:  (498, 256)\n",
      "num of points:  (498, 3)\n",
      "num of points after thresh:  (498, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  290 , inliers:  197 , percentage:  0.6793103448275862\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  214 , inliers:  147 , percentage:  0.6869158878504673\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "num of points:  (294, 256)\n",
      "num of points after thresh:  (294, 256)\n",
      "num of points:  (294, 3)\n",
      "num of points after thresh:  (294, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  159 , inliers:  110 , percentage:  0.6918238993710691\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "num of points:  (426, 256)\n",
      "num of points after thresh:  (426, 256)\n",
      "num of points:  (426, 3)\n",
      "num of points after thresh:  (426, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  244 , inliers:  150 , percentage:  0.6147540983606558\n",
      "num of points:  (436, 256)\n",
      "num of points after thresh:  (436, 256)\n",
      "num of points:  (436, 3)\n",
      "num of points after thresh:  (436, 3)\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  63 , percentage:  0.42\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "num of points:  (268, 256)\n",
      "num of points after thresh:  (268, 256)\n",
      "num of points:  (268, 3)\n",
      "num of points after thresh:  (268, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  124 , inliers:  52 , percentage:  0.41935483870967744\n",
      "num of points:  (328, 256)\n",
      "num of points after thresh:  (328, 256)\n",
      "num of points:  (328, 3)\n",
      "num of points after thresh:  (328, 3)\n",
      "num of points:  (359, 256)\n",
      "num of points after thresh:  (359, 256)\n",
      "num of points:  (359, 3)\n",
      "num of points after thresh:  (359, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  240 , inliers:  213 , percentage:  0.8875\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  174 , inliers:  64 , percentage:  0.367816091954023\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  246 , inliers:  110 , percentage:  0.44715447154471544\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "num of points:  (451, 256)\n",
      "num of points after thresh:  (451, 256)\n",
      "num of points:  (451, 3)\n",
      "num of points after thresh:  (451, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  243 , inliers:  156 , percentage:  0.6419753086419753\n",
      "num of points:  (358, 256)\n",
      "num of points after thresh:  (358, 256)\n",
      "num of points:  (358, 3)\n",
      "num of points after thresh:  (358, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  138 , inliers:  71 , percentage:  0.5144927536231884\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "num of points:  (511, 256)\n",
      "num of points after thresh:  (511, 256)\n",
      "num of points:  (511, 3)\n",
      "num of points after thresh:  (511, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  159 , inliers:  5 , percentage:  0.031446540880503145\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "num of points:  (296, 256)\n",
      "num of points after thresh:  (296, 256)\n",
      "num of points:  (296, 3)\n",
      "num of points after thresh:  (296, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  175 , inliers:  115 , percentage:  0.6571428571428571\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (428, 256)\n",
      "num of points after thresh:  (428, 256)\n",
      "num of points:  (428, 3)\n",
      "num of points after thresh:  (428, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  247 , inliers:  190 , percentage:  0.7692307692307693\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  183 , inliers:  124 , percentage:  0.6775956284153005\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "num of points:  (466, 256)\n",
      "num of points after thresh:  (466, 256)\n",
      "num of points:  (466, 3)\n",
      "num of points after thresh:  (466, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  338 , inliers:  265 , percentage:  0.7840236686390533\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "num of points:  (533, 256)\n",
      "num of points after thresh:  (533, 256)\n",
      "num of points:  (533, 3)\n",
      "num of points after thresh:  (533, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  7 , percentage:  0.042682926829268296\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  6 , percentage:  0.0379746835443038\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "num of points:  (387, 256)\n",
      "num of points after thresh:  (387, 256)\n",
      "num of points:  (387, 3)\n",
      "num of points after thresh:  (387, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  258 , inliers:  164 , percentage:  0.6356589147286822\n",
      "num of points:  (364, 256)\n",
      "num of points after thresh:  (364, 256)\n",
      "num of points:  (364, 3)\n",
      "num of points after thresh:  (364, 3)\n",
      "num of points:  (297, 256)\n",
      "num of points after thresh:  (297, 256)\n",
      "num of points:  (297, 3)\n",
      "num of points after thresh:  (297, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  156 , inliers:  94 , percentage:  0.6025641025641025\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  191 , inliers:  93 , percentage:  0.4869109947643979\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "num of points:  (427, 256)\n",
      "num of points after thresh:  (427, 256)\n",
      "num of points:  (427, 3)\n",
      "num of points after thresh:  (427, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  373 , inliers:  329 , percentage:  0.8820375335120644\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  299 , inliers:  269 , percentage:  0.8996655518394648\n",
      "num of points:  (385, 256)\n",
      "num of points after thresh:  (385, 256)\n",
      "num of points:  (385, 3)\n",
      "num of points after thresh:  (385, 3)\n",
      "num of points:  (430, 256)\n",
      "num of points after thresh:  (430, 256)\n",
      "num of points:  (430, 3)\n",
      "num of points after thresh:  (430, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  157 , inliers:  71 , percentage:  0.45222929936305734\n",
      "num of points:  (325, 256)\n",
      "num of points after thresh:  (325, 256)\n",
      "num of points:  (325, 3)\n",
      "num of points after thresh:  (325, 3)\n",
      "num of points:  (285, 256)\n",
      "num of points after thresh:  (285, 256)\n",
      "num of points:  (285, 3)\n",
      "num of points after thresh:  (285, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  158 , inliers:  88 , percentage:  0.5569620253164557\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "num of points:  (424, 256)\n",
      "num of points after thresh:  (424, 256)\n",
      "num of points:  (424, 3)\n",
      "num of points after thresh:  (424, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  112 , inliers:  37 , percentage:  0.33035714285714285\n",
      "num of points:  (391, 256)\n",
      "num of points after thresh:  (391, 256)\n",
      "num of points:  (391, 3)\n",
      "num of points after thresh:  (391, 3)\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  286 , inliers:  230 , percentage:  0.8041958041958042\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "num of points:  (430, 256)\n",
      "num of points after thresh:  (430, 256)\n",
      "num of points:  (430, 3)\n",
      "num of points after thresh:  (430, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  173 , inliers:  92 , percentage:  0.5317919075144508\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  199 , inliers:  133 , percentage:  0.6683417085427136\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (497, 256)\n",
      "num of points after thresh:  (497, 256)\n",
      "num of points:  (497, 3)\n",
      "num of points after thresh:  (497, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  123 , percentage:  0.5324675324675324\n",
      "num of points:  (454, 256)\n",
      "num of points after thresh:  (454, 256)\n",
      "num of points:  (454, 3)\n",
      "num of points after thresh:  (454, 3)\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  270 , inliers:  178 , percentage:  0.6592592592592592\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (404, 256)\n",
      "num of points after thresh:  (404, 256)\n",
      "num of points:  (404, 3)\n",
      "num of points after thresh:  (404, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  211 , inliers:  144 , percentage:  0.6824644549763034\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "num of points:  (338, 256)\n",
      "num of points after thresh:  (338, 256)\n",
      "num of points:  (338, 3)\n",
      "num of points after thresh:  (338, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  198 , inliers:  140 , percentage:  0.7070707070707071\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "num of points:  (408, 256)\n",
      "num of points after thresh:  (408, 256)\n",
      "num of points:  (408, 3)\n",
      "num of points after thresh:  (408, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  277 , inliers:  230 , percentage:  0.8303249097472925\n",
      "num of points:  (305, 256)\n",
      "num of points after thresh:  (305, 256)\n",
      "num of points:  (305, 3)\n",
      "num of points after thresh:  (305, 3)\n",
      "num of points:  (295, 256)\n",
      "num of points after thresh:  (295, 256)\n",
      "num of points:  (295, 3)\n",
      "num of points after thresh:  (295, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  221 , inliers:  193 , percentage:  0.8733031674208145\n",
      "num of points:  (379, 256)\n",
      "num of points after thresh:  (379, 256)\n",
      "num of points:  (379, 3)\n",
      "num of points after thresh:  (379, 3)\n",
      "num of points:  (367, 256)\n",
      "num of points after thresh:  (367, 256)\n",
      "num of points:  (367, 3)\n",
      "num of points after thresh:  (367, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  180 , inliers:  112 , percentage:  0.6222222222222222\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "num of points:  (359, 256)\n",
      "num of points after thresh:  (359, 256)\n",
      "num of points:  (359, 3)\n",
      "num of points after thresh:  (359, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  127 , inliers:  27 , percentage:  0.2125984251968504\n",
      "num of points:  (486, 256)\n",
      "num of points after thresh:  (486, 256)\n",
      "num of points:  (486, 3)\n",
      "num of points after thresh:  (486, 3)\n",
      "num of points:  (525, 256)\n",
      "num of points after thresh:  (525, 256)\n",
      "num of points:  (525, 3)\n",
      "num of points after thresh:  (525, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  182 , inliers:  31 , percentage:  0.17032967032967034\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (464, 256)\n",
      "num of points after thresh:  (464, 256)\n",
      "num of points:  (464, 3)\n",
      "num of points after thresh:  (464, 3)\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  190 , inliers:  85 , percentage:  0.4473684210526316\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  236 , inliers:  133 , percentage:  0.5635593220338984\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "num of points:  (441, 256)\n",
      "num of points after thresh:  (441, 256)\n",
      "num of points:  (441, 3)\n",
      "num of points after thresh:  (441, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  219 , inliers:  142 , percentage:  0.6484018264840182\n",
      "num of points:  (390, 256)\n",
      "num of points after thresh:  (390, 256)\n",
      "num of points:  (390, 3)\n",
      "num of points after thresh:  (390, 3)\n",
      "num of points:  (392, 256)\n",
      "num of points after thresh:  (392, 256)\n",
      "num of points:  (392, 3)\n",
      "num of points after thresh:  (392, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  184 , inliers:  122 , percentage:  0.6630434782608695\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "num of points:  (365, 256)\n",
      "num of points after thresh:  (365, 256)\n",
      "num of points:  (365, 3)\n",
      "num of points after thresh:  (365, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  138 , inliers:  46 , percentage:  0.3333333333333333\n",
      "num of points:  (279, 256)\n",
      "num of points after thresh:  (279, 256)\n",
      "num of points:  (279, 3)\n",
      "num of points after thresh:  (279, 3)\n",
      "num of points:  (270, 256)\n",
      "num of points after thresh:  (270, 256)\n",
      "num of points:  (270, 3)\n",
      "num of points after thresh:  (270, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  181 , inliers:  137 , percentage:  0.7569060773480663\n",
      "num of points:  (264, 256)\n",
      "num of points after thresh:  (264, 256)\n",
      "num of points:  (264, 3)\n",
      "num of points after thresh:  (264, 3)\n",
      "num of points:  (302, 256)\n",
      "num of points after thresh:  (302, 256)\n",
      "num of points:  (302, 3)\n",
      "num of points after thresh:  (302, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  213 , inliers:  186 , percentage:  0.8732394366197183\n",
      "num of points:  (218, 256)\n",
      "num of points after thresh:  (218, 256)\n",
      "num of points:  (218, 3)\n",
      "num of points after thresh:  (218, 3)\n",
      "num of points:  (224, 256)\n",
      "num of points after thresh:  (224, 256)\n",
      "num of points:  (224, 3)\n",
      "num of points after thresh:  (224, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  196 , inliers:  193 , percentage:  0.9846938775510204\n",
      "num of points:  (440, 256)\n",
      "num of points after thresh:  (440, 256)\n",
      "num of points:  (440, 3)\n",
      "num of points after thresh:  (440, 3)\n",
      "num of points:  (446, 256)\n",
      "num of points after thresh:  (446, 256)\n",
      "num of points:  (446, 3)\n",
      "num of points after thresh:  (446, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  193 , inliers:  112 , percentage:  0.5803108808290155\n",
      "num of points:  (412, 256)\n",
      "num of points after thresh:  (412, 256)\n",
      "num of points:  (412, 3)\n",
      "num of points after thresh:  (412, 3)\n",
      "num of points:  (381, 256)\n",
      "num of points after thresh:  (381, 256)\n",
      "num of points:  (381, 3)\n",
      "num of points after thresh:  (381, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  138 , inliers:  20 , percentage:  0.14492753623188406\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  185 , inliers:  129 , percentage:  0.6972972972972973\n",
      "num of points:  (512, 256)\n",
      "num of points after thresh:  (512, 256)\n",
      "num of points:  (512, 3)\n",
      "num of points after thresh:  (512, 3)\n",
      "num of points:  (560, 256)\n",
      "num of points after thresh:  (560, 256)\n",
      "num of points:  (560, 3)\n",
      "num of points after thresh:  (560, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  360 , inliers:  310 , percentage:  0.8611111111111112\n",
      "num of points:  (335, 256)\n",
      "num of points after thresh:  (335, 256)\n",
      "num of points:  (335, 3)\n",
      "num of points after thresh:  (335, 3)\n",
      "num of points:  (310, 256)\n",
      "num of points after thresh:  (310, 256)\n",
      "num of points:  (310, 3)\n",
      "num of points after thresh:  (310, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  190 , inliers:  166 , percentage:  0.8736842105263158\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "num of points:  (393, 256)\n",
      "num of points after thresh:  (393, 256)\n",
      "num of points:  (393, 3)\n",
      "num of points after thresh:  (393, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  97 , percentage:  0.5480225988700564\n",
      "num of points:  (523, 256)\n",
      "num of points after thresh:  (523, 256)\n",
      "num of points:  (523, 3)\n",
      "num of points after thresh:  (523, 3)\n",
      "num of points:  (493, 256)\n",
      "num of points after thresh:  (493, 256)\n",
      "num of points:  (493, 3)\n",
      "num of points after thresh:  (493, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  239 , inliers:  124 , percentage:  0.5188284518828452\n",
      "num of points:  (502, 256)\n",
      "num of points after thresh:  (502, 256)\n",
      "num of points:  (502, 3)\n",
      "num of points after thresh:  (502, 3)\n",
      "num of points:  (455, 256)\n",
      "num of points after thresh:  (455, 256)\n",
      "num of points:  (455, 3)\n",
      "num of points after thresh:  (455, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  180 , inliers:  69 , percentage:  0.38333333333333336\n",
      "num of points:  (301, 256)\n",
      "num of points after thresh:  (301, 256)\n",
      "num of points:  (301, 3)\n",
      "num of points after thresh:  (301, 3)\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  99 , inliers:  22 , percentage:  0.2222222222222222\n",
      "num of points:  (245, 256)\n",
      "num of points after thresh:  (245, 256)\n",
      "num of points:  (245, 3)\n",
      "num of points after thresh:  (245, 3)\n",
      "num of points:  (298, 256)\n",
      "num of points after thresh:  (298, 256)\n",
      "num of points:  (298, 3)\n",
      "num of points after thresh:  (298, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  110 , inliers:  60 , percentage:  0.5454545454545454\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "num of points:  (317, 256)\n",
      "num of points after thresh:  (317, 256)\n",
      "num of points:  (317, 3)\n",
      "num of points after thresh:  (317, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  121 , inliers:  28 , percentage:  0.23140495867768596\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "num of points:  (388, 256)\n",
      "num of points after thresh:  (388, 256)\n",
      "num of points:  (388, 3)\n",
      "num of points after thresh:  (388, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  7 , percentage:  0.04666666666666667\n",
      "num of points:  (442, 256)\n",
      "num of points after thresh:  (442, 256)\n",
      "num of points:  (442, 3)\n",
      "num of points after thresh:  (442, 3)\n",
      "num of points:  (459, 256)\n",
      "num of points after thresh:  (459, 256)\n",
      "num of points:  (459, 3)\n",
      "num of points after thresh:  (459, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  319 , inliers:  274 , percentage:  0.8589341692789969\n",
      "num of points:  (396, 256)\n",
      "num of points after thresh:  (396, 256)\n",
      "num of points:  (396, 3)\n",
      "num of points after thresh:  (396, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  251 , inliers:  201 , percentage:  0.8007968127490039\n",
      "num of points:  (344, 256)\n",
      "num of points after thresh:  (344, 256)\n",
      "num of points:  (344, 3)\n",
      "num of points after thresh:  (344, 3)\n",
      "num of points:  (351, 256)\n",
      "num of points after thresh:  (351, 256)\n",
      "num of points:  (351, 3)\n",
      "num of points after thresh:  (351, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  164 , inliers:  119 , percentage:  0.725609756097561\n",
      "num of points:  (528, 256)\n",
      "num of points after thresh:  (528, 256)\n",
      "num of points:  (528, 3)\n",
      "num of points after thresh:  (528, 3)\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "use opencv estimation for inliers\n",
      "Total matches:  196 , inliers:  61 , percentage:  0.3112244897959184\n",
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "num of points:  (403, 256)\n",
      "num of points after thresh:  (403, 256)\n",
      "num of points:  (403, 3)\n",
      "num of points after thresh:  (403, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  145 , inliers:  55 , percentage:  0.3793103448275862\n",
      "num of points:  (437, 256)\n",
      "num of points after thresh:  (437, 256)\n",
      "num of points:  (437, 3)\n",
      "num of points after thresh:  (437, 3)\n",
      "num of points:  (435, 256)\n",
      "num of points after thresh:  (435, 256)\n",
      "num of points:  (435, 3)\n",
      "num of points after thresh:  (435, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  151 , inliers:  25 , percentage:  0.16556291390728478\n",
      "num of points:  (278, 256)\n",
      "num of points after thresh:  (278, 256)\n",
      "num of points:  (278, 3)\n",
      "num of points after thresh:  (278, 3)\n",
      "num of points:  (273, 256)\n",
      "num of points after thresh:  (273, 256)\n",
      "num of points:  (273, 3)\n",
      "num of points after thresh:  (273, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  194 , inliers:  172 , percentage:  0.8865979381443299\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  307 , inliers:  193 , percentage:  0.6286644951140065\n",
      "num of points:  (389, 256)\n",
      "num of points after thresh:  (389, 256)\n",
      "num of points:  (389, 3)\n",
      "num of points after thresh:  (389, 3)\n",
      "num of points:  (414, 256)\n",
      "num of points after thresh:  (414, 256)\n",
      "num of points:  (414, 3)\n",
      "num of points after thresh:  (414, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  143 , inliers:  27 , percentage:  0.1888111888111888\n",
      "num of points:  (504, 256)\n",
      "num of points after thresh:  (504, 256)\n",
      "num of points:  (504, 3)\n",
      "num of points after thresh:  (504, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  310 , inliers:  235 , percentage:  0.7580645161290323\n",
      "num of points:  (360, 256)\n",
      "num of points after thresh:  (360, 256)\n",
      "num of points:  (360, 3)\n",
      "num of points after thresh:  (360, 3)\n",
      "num of points:  (368, 256)\n",
      "num of points after thresh:  (368, 256)\n",
      "num of points:  (368, 3)\n",
      "num of points after thresh:  (368, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  162 , inliers:  93 , percentage:  0.5740740740740741\n",
      "num of points:  (237, 256)\n",
      "num of points after thresh:  (237, 256)\n",
      "num of points:  (237, 3)\n",
      "num of points after thresh:  (237, 3)\n",
      "num of points:  (359, 256)\n",
      "num of points after thresh:  (359, 256)\n",
      "num of points:  (359, 3)\n",
      "num of points after thresh:  (359, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  112 , inliers:  48 , percentage:  0.42857142857142855\n",
      "num of points:  (438, 256)\n",
      "num of points after thresh:  (438, 256)\n",
      "num of points:  (438, 3)\n",
      "num of points after thresh:  (438, 3)\n",
      "num of points:  (452, 256)\n",
      "num of points after thresh:  (452, 256)\n",
      "num of points:  (452, 3)\n",
      "num of points after thresh:  (452, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  283 , inliers:  231 , percentage:  0.8162544169611308\n",
      "num of points:  (397, 256)\n",
      "num of points after thresh:  (397, 256)\n",
      "num of points:  (397, 3)\n",
      "num of points after thresh:  (397, 3)\n",
      "num of points:  (349, 256)\n",
      "num of points after thresh:  (349, 256)\n",
      "num of points:  (349, 3)\n",
      "num of points after thresh:  (349, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  202 , inliers:  141 , percentage:  0.698019801980198\n",
      "num of points:  (264, 256)\n",
      "num of points after thresh:  (264, 256)\n",
      "num of points:  (264, 3)\n",
      "num of points after thresh:  (264, 3)\n",
      "num of points:  (269, 256)\n",
      "num of points after thresh:  (269, 256)\n",
      "num of points:  (269, 3)\n",
      "num of points after thresh:  (269, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  176 , inliers:  132 , percentage:  0.75\n",
      "num of points:  (577, 256)\n",
      "num of points after thresh:  (577, 256)\n",
      "num of points:  (577, 3)\n",
      "num of points after thresh:  (577, 3)\n",
      "num of points:  (515, 256)\n",
      "num of points after thresh:  (515, 256)\n",
      "num of points:  (515, 3)\n",
      "num of points after thresh:  (515, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  179 , inliers:  31 , percentage:  0.17318435754189945\n",
      "num of points:  (545, 256)\n",
      "num of points after thresh:  (545, 256)\n",
      "num of points:  (545, 3)\n",
      "num of points after thresh:  (545, 3)\n",
      "num of points:  (527, 256)\n",
      "num of points after thresh:  (527, 256)\n",
      "num of points:  (527, 3)\n",
      "num of points after thresh:  (527, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  238 , inliers:  167 , percentage:  0.7016806722689075\n",
      "num of points:  (328, 256)\n",
      "num of points after thresh:  (328, 256)\n",
      "num of points:  (328, 3)\n",
      "num of points after thresh:  (328, 3)\n",
      "num of points:  (356, 256)\n",
      "num of points after thresh:  (356, 256)\n",
      "num of points:  (356, 3)\n",
      "num of points after thresh:  (356, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  250 , inliers:  226 , percentage:  0.904\n",
      "num of points:  (460, 256)\n",
      "num of points after thresh:  (460, 256)\n",
      "num of points:  (460, 3)\n",
      "num of points after thresh:  (460, 3)\n",
      "num of points:  (479, 256)\n",
      "num of points after thresh:  (479, 256)\n",
      "num of points:  (479, 3)\n",
      "num of points after thresh:  (479, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  244 , inliers:  175 , percentage:  0.7172131147540983\n",
      "num of points:  (401, 256)\n",
      "num of points after thresh:  (401, 256)\n",
      "num of points:  (401, 3)\n",
      "num of points after thresh:  (401, 3)\n",
      "num of points:  (399, 256)\n",
      "num of points after thresh:  (399, 256)\n",
      "num of points:  (399, 3)\n",
      "num of points after thresh:  (399, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  285 , inliers:  243 , percentage:  0.8526315789473684\n",
      "num of points:  (312, 256)\n",
      "num of points after thresh:  (312, 256)\n",
      "num of points:  (312, 3)\n",
      "num of points after thresh:  (312, 3)\n",
      "num of points:  (235, 256)\n",
      "num of points after thresh:  (235, 256)\n",
      "num of points:  (235, 3)\n",
      "num of points after thresh:  (235, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  92 , inliers:  17 , percentage:  0.18478260869565216\n",
      "num of points:  (354, 256)\n",
      "num of points after thresh:  (354, 256)\n",
      "num of points:  (354, 3)\n",
      "num of points after thresh:  (354, 3)\n",
      "num of points:  (353, 256)\n",
      "num of points after thresh:  (353, 256)\n",
      "num of points:  (353, 3)\n",
      "num of points after thresh:  (353, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  208 , inliers:  142 , percentage:  0.6826923076923077\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (400, 256)\n",
      "num of points after thresh:  (400, 256)\n",
      "num of points:  (400, 3)\n",
      "num of points after thresh:  (400, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  293 , inliers:  262 , percentage:  0.89419795221843\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "num of points:  (531, 256)\n",
      "num of points after thresh:  (531, 256)\n",
      "num of points:  (531, 3)\n",
      "num of points after thresh:  (531, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  245 , inliers:  146 , percentage:  0.5959183673469388\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (421, 256)\n",
      "num of points after thresh:  (421, 256)\n",
      "num of points:  (421, 3)\n",
      "num of points after thresh:  (421, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  220 , inliers:  152 , percentage:  0.6909090909090909\n",
      "num of points:  (415, 256)\n",
      "num of points after thresh:  (415, 256)\n",
      "num of points:  (415, 3)\n",
      "num of points after thresh:  (415, 3)\n",
      "num of points:  (431, 256)\n",
      "num of points after thresh:  (431, 256)\n",
      "num of points:  (431, 3)\n",
      "num of points after thresh:  (431, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  322 , inliers:  262 , percentage:  0.8136645962732919\n",
      "num of points:  (506, 256)\n",
      "num of points after thresh:  (506, 256)\n",
      "num of points:  (506, 3)\n",
      "num of points after thresh:  (506, 3)\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  342 , inliers:  301 , percentage:  0.8801169590643275\n",
      "num of points:  (417, 256)\n",
      "num of points after thresh:  (417, 256)\n",
      "num of points:  (417, 3)\n",
      "num of points after thresh:  (417, 3)\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "use opencv estimation for inliers\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total matches:  289 , inliers:  236 , percentage:  0.8166089965397924\n",
      "num of points:  (523, 256)\n",
      "num of points after thresh:  (523, 256)\n",
      "num of points:  (523, 3)\n",
      "num of points after thresh:  (523, 3)\n",
      "num of points:  (488, 256)\n",
      "num of points after thresh:  (488, 256)\n",
      "num of points:  (488, 3)\n",
      "num of points after thresh:  (488, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  300 , inliers:  176 , percentage:  0.5866666666666667\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (350, 256)\n",
      "num of points after thresh:  (350, 256)\n",
      "num of points:  (350, 3)\n",
      "num of points after thresh:  (350, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  187 , inliers:  128 , percentage:  0.6844919786096256\n",
      "num of points:  (334, 256)\n",
      "num of points after thresh:  (334, 256)\n",
      "num of points:  (334, 3)\n",
      "num of points after thresh:  (334, 3)\n",
      "num of points:  (368, 256)\n",
      "num of points after thresh:  (368, 256)\n",
      "num of points:  (368, 3)\n",
      "num of points after thresh:  (368, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  61 , percentage:  0.4066666666666667\n",
      "num of points:  (481, 256)\n",
      "num of points after thresh:  (481, 256)\n",
      "num of points:  (481, 3)\n",
      "num of points after thresh:  (481, 3)\n",
      "num of points:  (458, 256)\n",
      "num of points after thresh:  (458, 256)\n",
      "num of points:  (458, 3)\n",
      "num of points after thresh:  (458, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  210 , inliers:  120 , percentage:  0.5714285714285714\n",
      "num of points:  (352, 256)\n",
      "num of points after thresh:  (352, 256)\n",
      "num of points:  (352, 3)\n",
      "num of points after thresh:  (352, 3)\n",
      "num of points:  (317, 256)\n",
      "num of points after thresh:  (317, 256)\n",
      "num of points:  (317, 3)\n",
      "num of points after thresh:  (317, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  233 , inliers:  157 , percentage:  0.6738197424892703\n",
      "num of points:  (457, 256)\n",
      "num of points after thresh:  (457, 256)\n",
      "num of points:  (457, 3)\n",
      "num of points after thresh:  (457, 3)\n",
      "num of points:  (465, 256)\n",
      "num of points after thresh:  (465, 256)\n",
      "num of points:  (465, 3)\n",
      "num of points after thresh:  (465, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  150 , inliers:  5 , percentage:  0.03333333333333333\n",
      "num of points:  (526, 256)\n",
      "num of points after thresh:  (526, 256)\n",
      "num of points:  (526, 3)\n",
      "num of points after thresh:  (526, 3)\n",
      "num of points:  (557, 256)\n",
      "num of points after thresh:  (557, 256)\n",
      "num of points:  (557, 3)\n",
      "num of points after thresh:  (557, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  380 , inliers:  313 , percentage:  0.8236842105263158\n",
      "num of points:  (420, 256)\n",
      "num of points after thresh:  (420, 256)\n",
      "num of points:  (420, 3)\n",
      "num of points after thresh:  (420, 3)\n",
      "num of points:  (477, 256)\n",
      "num of points after thresh:  (477, 256)\n",
      "num of points:  (477, 3)\n",
      "num of points after thresh:  (477, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  226 , inliers:  128 , percentage:  0.5663716814159292\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "num of points:  (414, 256)\n",
      "num of points after thresh:  (414, 256)\n",
      "num of points:  (414, 3)\n",
      "num of points after thresh:  (414, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  138 , inliers:  53 , percentage:  0.38405797101449274\n",
      "num of points:  (287, 256)\n",
      "num of points after thresh:  (287, 256)\n",
      "num of points:  (287, 3)\n",
      "num of points after thresh:  (287, 3)\n",
      "num of points:  (371, 256)\n",
      "num of points after thresh:  (371, 256)\n",
      "num of points:  (371, 3)\n",
      "num of points after thresh:  (371, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  177 , inliers:  121 , percentage:  0.6836158192090396\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (482, 256)\n",
      "num of points after thresh:  (482, 256)\n",
      "num of points:  (482, 3)\n",
      "num of points after thresh:  (482, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  209 , inliers:  136 , percentage:  0.6507177033492823\n",
      "num of points:  (485, 256)\n",
      "num of points after thresh:  (485, 256)\n",
      "num of points:  (485, 3)\n",
      "num of points after thresh:  (485, 3)\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  159 , inliers:  17 , percentage:  0.1069182389937107\n",
      "num of points:  (448, 256)\n",
      "num of points after thresh:  (448, 256)\n",
      "num of points:  (448, 3)\n",
      "num of points after thresh:  (448, 3)\n",
      "num of points:  (466, 256)\n",
      "num of points after thresh:  (466, 256)\n",
      "num of points:  (466, 3)\n",
      "num of points after thresh:  (466, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  223 , inliers:  128 , percentage:  0.5739910313901345\n",
      "num of points:  (278, 256)\n",
      "num of points after thresh:  (278, 256)\n",
      "num of points:  (278, 3)\n",
      "num of points after thresh:  (278, 3)\n",
      "num of points:  (282, 256)\n",
      "num of points after thresh:  (282, 256)\n",
      "num of points:  (282, 3)\n",
      "num of points after thresh:  (282, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  232 , inliers:  220 , percentage:  0.9482758620689655\n",
      "num of points:  (444, 256)\n",
      "num of points after thresh:  (444, 256)\n",
      "num of points:  (444, 3)\n",
      "num of points after thresh:  (444, 3)\n",
      "num of points:  (429, 256)\n",
      "num of points after thresh:  (429, 256)\n",
      "num of points:  (429, 3)\n",
      "num of points after thresh:  (429, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  122 , inliers:  6 , percentage:  0.04918032786885246\n",
      "num of points:  (470, 256)\n",
      "num of points after thresh:  (470, 256)\n",
      "num of points:  (470, 3)\n",
      "num of points after thresh:  (470, 3)\n",
      "num of points:  (408, 256)\n",
      "num of points after thresh:  (408, 256)\n",
      "num of points:  (408, 3)\n",
      "num of points after thresh:  (408, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  147 , inliers:  52 , percentage:  0.35374149659863946\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "num of points:  (410, 256)\n",
      "num of points after thresh:  (410, 256)\n",
      "num of points:  (410, 3)\n",
      "num of points after thresh:  (410, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  193 , inliers:  112 , percentage:  0.5803108808290155\n",
      "num of points:  (394, 256)\n",
      "num of points after thresh:  (394, 256)\n",
      "num of points:  (394, 3)\n",
      "num of points after thresh:  (394, 3)\n",
      "num of points:  (306, 256)\n",
      "num of points after thresh:  (306, 256)\n",
      "num of points:  (306, 3)\n",
      "num of points after thresh:  (306, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  123 , inliers:  14 , percentage:  0.11382113821138211\n",
      "num of points:  (449, 256)\n",
      "num of points after thresh:  (449, 256)\n",
      "num of points:  (449, 3)\n",
      "num of points after thresh:  (449, 3)\n",
      "num of points:  (478, 256)\n",
      "num of points after thresh:  (478, 256)\n",
      "num of points:  (478, 3)\n",
      "num of points after thresh:  (478, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  226 , inliers:  166 , percentage:  0.7345132743362832\n",
      "num of points:  (425, 256)\n",
      "num of points after thresh:  (425, 256)\n",
      "num of points:  (425, 3)\n",
      "num of points after thresh:  (425, 3)\n",
      "num of points:  (355, 256)\n",
      "num of points after thresh:  (355, 256)\n",
      "num of points:  (355, 3)\n",
      "num of points after thresh:  (355, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  135 , inliers:  81 , percentage:  0.6\n",
      "num of points:  (528, 256)\n",
      "num of points after thresh:  (528, 256)\n",
      "num of points:  (528, 3)\n",
      "num of points after thresh:  (528, 3)\n",
      "num of points:  (475, 256)\n",
      "num of points after thresh:  (475, 256)\n",
      "num of points:  (475, 3)\n",
      "num of points after thresh:  (475, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  219 , inliers:  111 , percentage:  0.5068493150684932\n",
      "num of points:  (468, 256)\n",
      "num of points after thresh:  (468, 256)\n",
      "num of points:  (468, 3)\n",
      "num of points after thresh:  (468, 3)\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  185 , inliers:  85 , percentage:  0.4594594594594595\n",
      "num of points:  (373, 256)\n",
      "num of points after thresh:  (373, 256)\n",
      "num of points:  (373, 3)\n",
      "num of points after thresh:  (373, 3)\n",
      "num of points:  (398, 256)\n",
      "num of points after thresh:  (398, 256)\n",
      "num of points:  (398, 3)\n",
      "num of points after thresh:  (398, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  260 , inliers:  215 , percentage:  0.8269230769230769\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num of points:  (463, 256)\n",
      "num of points after thresh:  (463, 256)\n",
      "num of points:  (463, 3)\n",
      "num of points after thresh:  (463, 3)\n",
      "num of points:  (365, 256)\n",
      "num of points after thresh:  (365, 256)\n",
      "num of points:  (365, 3)\n",
      "num of points after thresh:  (365, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  137 , inliers:  70 , percentage:  0.5109489051094891\n",
      "num of points:  (311, 256)\n",
      "num of points after thresh:  (311, 256)\n",
      "num of points:  (311, 3)\n",
      "num of points after thresh:  (311, 3)\n",
      "num of points:  (377, 256)\n",
      "num of points after thresh:  (377, 256)\n",
      "num of points:  (377, 3)\n",
      "num of points after thresh:  (377, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  104 , inliers:  38 , percentage:  0.36538461538461536\n",
      "num of points:  (332, 256)\n",
      "num of points after thresh:  (332, 256)\n",
      "num of points:  (332, 3)\n",
      "num of points after thresh:  (332, 3)\n",
      "num of points:  (333, 256)\n",
      "num of points after thresh:  (333, 256)\n",
      "num of points:  (333, 3)\n",
      "num of points after thresh:  (333, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  104 , inliers:  45 , percentage:  0.4326923076923077\n",
      "num of points:  (514, 256)\n",
      "num of points after thresh:  (514, 256)\n",
      "num of points:  (514, 3)\n",
      "num of points after thresh:  (514, 3)\n",
      "num of points:  (497, 256)\n",
      "num of points after thresh:  (497, 256)\n",
      "num of points:  (497, 3)\n",
      "num of points after thresh:  (497, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  231 , inliers:  123 , percentage:  0.5324675324675324\n",
      "num of points:  (456, 256)\n",
      "num of points after thresh:  (456, 256)\n",
      "num of points:  (456, 3)\n",
      "num of points after thresh:  (456, 3)\n",
      "num of points:  (484, 256)\n",
      "num of points after thresh:  (484, 256)\n",
      "num of points:  (484, 3)\n",
      "num of points after thresh:  (484, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  303 , inliers:  234 , percentage:  0.7722772277227723\n",
      "num of points:  (433, 256)\n",
      "num of points after thresh:  (433, 256)\n",
      "num of points:  (433, 3)\n",
      "num of points after thresh:  (433, 3)\n",
      "num of points:  (488, 256)\n",
      "num of points after thresh:  (488, 256)\n",
      "num of points:  (488, 3)\n",
      "num of points after thresh:  (488, 3)\n",
      "use opencv estimation for inliers\n",
      "Total matches:  327 , inliers:  300 , percentage:  0.9174311926605505\n",
      "(580, 4)\n"
     ]
    }
   ],
   "source": [
    "inliers_exp, matches_exp, mscores_exp = {}, {}, {}\n",
    "\n",
    "verbose = False\n",
    "inliers_method = 'cv'\n",
    "# threshs = np.array([0.7, 0.8, 0.9, 1.0, 1.2])\n",
    "threshs = np.array([0.1, 0.2, 0.3, 0.4, 0.5,\n",
    "                    0.6, 0.7, 0.8, 0.9, 1.0,\n",
    "                    1.1, 1.2, 1.3, 1.4, 1.5,\n",
    "                    1.6, 1.7, 1.8, 1.9, 2.0])\n",
    "m_count = 600\n",
    "det_thd = 0.015 # 0.105\n",
    "all_num_points = []\n",
    "print(\"det threshold: \", det_thd)\n",
    "\n",
    "for folder in folders:\n",
    "    print(\"work on \", folder)\n",
    "    num_points = [] # [[keypoints, warped_keypoints, unwarped_keypoints]]\n",
    "    exp_path = Path(base_path, folder, prediction)\n",
    "    files = os.listdir( exp_path )\n",
    "    # empty stackes\n",
    "    count = 0\n",
    "    inliers_all = [] \n",
    "    matches_all = []\n",
    "    mscores_all = []\n",
    "    inliersThds_all = []\n",
    "    matchesThds_all = []\n",
    "    p_inliers_all = []\n",
    "    for f in files:\n",
    "    #     print(\"file: \", f)\n",
    "        if f[-3:] == 'npz':\n",
    "            data = np.load(exp_path/f)   \n",
    "            # filter points\n",
    "            data = dataFilterDetection(data, det_thd=det_thd, verbose=True)\n",
    "            \n",
    "            # compute matches\n",
    "            matches, mscores = getMatches(data, verbose=verbose)\n",
    "            real_H = data['homography']\n",
    "            \n",
    "            if inliers_method == 'gt':\n",
    "                # use ground truth homography\n",
    "                print(\"use ground truth homography for inliers\")\n",
    "                inliers = getInliers(matches, real_H, epi=3, verbose=verbose)\n",
    "            else:\n",
    "                # use opencv estimation as inliers\n",
    "                print(\"use opencv estimation for inliers\")\n",
    "                inliers = getInliers_cv(matches, real_H, epi=3, verbose=verbose)\n",
    "            \n",
    "            \n",
    "#             print(\"inliers: \", inliers)\n",
    "            num_points.append(getNumPoints(data))\n",
    "            \n",
    "            n_matches, n_inliers = inliersThds(mscores[:,2], threshs, inliers)\n",
    "            \n",
    "            p_inliers = np.divide(n_inliers, n_matches + 0.0001)\n",
    "            if verbose:\n",
    "                print(\"inliers: \", n_inliers)\n",
    "                print(\"matches: \", n_matches)\n",
    "                print(\"p_inliers: \", p_inliers)\n",
    "            \n",
    "            matches_all.append(matches)\n",
    "            mscores_all.append(mscores)\n",
    "            inliers_all.append(inliers)\n",
    "            inliersThds_all.append(n_inliers)\n",
    "            matchesThds_all.append(n_matches)\n",
    "            p_inliers_all.append(p_inliers)\n",
    "            \n",
    "        if count == m_count:\n",
    "            break\n",
    "        count += 1\n",
    "#     inliers_exp.update({folder: inliers_all})\n",
    "#     matches_exp.update({folder: matches_all})\n",
    "#     mscores_exp.update({folder: mscores_all})\n",
    "    exp_results = {'matches_all': matches_all, 'mscores_all': mscores_all, 'inliers_all': inliers_all,\n",
    "                  'inliersThds_all': inliersThds_all, 'matchesThds_all': matchesThds_all,\n",
    "                  'p_inliers_all': p_inliers_all}\n",
    "    inliers_exp.update({folder: exp_results})\n",
    "    \n",
    "    \n",
    "    num_points = np.array(num_points)\n",
    "    print(num_points.shape)\n",
    "    all_num_points.append(num_points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "type(data)\n",
    "pred = {}\n",
    "pred.update(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "save exp:  superpoint_coco40_15_170k_hpatches_nms4_det0.015\n"
     ]
    }
   ],
   "source": [
    "# save the computation results\n",
    "# save_path = 'logs/experiments/evaluation_results'\n",
    "for folder in folders:\n",
    "    print(\"save exp: \", folder)\n",
    "    file_name = folder\n",
    "    path = Path(base_path, folder,'{}.npz'.format('statistics' + '_' + inliers_method))\n",
    "    np.savez_compressed(path, **inliers_exp[folder])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "plot:  inliersThds_all\n"
     ]
    },
    {
     "data": {
      "image/png": "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Kq6ozLqnb5e4dVvzqzWbwt7s3aNHj/IePXqUA7Ru3brquOOO279hw4YmoYlt5syZrS6//PKdGRkZjB49em9JSUlWYWFhdvV8jYmqIkVEUsjq1aubrFy5svm//du/7Qkdvnnz5uyePXserH7fqVOng4WFhdmJjzB4SmwiIimiuLg443vf+95xDzzwwMbG+oDjaCixiYikgAMHDtj5559/3CWXXPLVhAkTdtcc36lTp/LQjkU3b97cpDFWQ4ISm4hI0quqqmL8+PE9+vXrV3bXXXdtrW2asWPH7p42bVrbqqoq3n333WNyc3MrG2tiU+MREZEkN3v27BavvfZa2759++4fMGBAPsDdd9+9qbCwsAl43daMGzeu+I033sjr0aPH4GbNmlVNnjy5INCgA6TEJiISo7yszIpILRljLS/c+HPOOWePc25xuGkyMjJ47rnnNsQrplSmxO0HoTcAAACXSURBVCYiEqNw95xJ8HSNTURE0ooSm4iIpBUlNhGRyKqqqqos6CDiwf8caX0PnBKbiEhkK7Zv356X6smtqqrKtm/fngesCDqWhqTGIyIiEVRUVFy7ZcuWyVu2bBlMap8QVAErKioqrg06kIZkzrmgYxAREYmbVP7lISIicgQlNhERSStKbCIiklaU2EREJK0osYmISFr5/0H1dMla7dOxAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "plot:  matchesThds_all\n"
     ]
    },
    {
     "data": {
      "image/png": "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0bGmm5TuT1FEJNEWLVqUP3z48JSoBBSPRYsWHTp8+PBeiY4jUVR8KiKS4mJ1HQVB91EDBw4c3Ldv3yHHHHPMgKaML5Wo+FREJERvP/14xz07d4R2bm1+SKvy0eMvjPqaR6yuowoLCzOvueaaHq+88sryfv367V23bp3O/bXQhhERCdGenTuyTpr03dC6jpo3428xGwKI1XXUtGnT2p111lnb+vXrtxega9euqrFaCxWfioikuWXLluVs27Yt69hjjx0wZMiQQffee2/7RMeUrHSnKCKS5srLy23x4sUt//3vfy/buXNnxqhRowaeeOKJO4YNG7Yn0bElGyVFEZE0161bt73t27cvb926dWXr1q0rjzvuuJIFCxa0VFI8kIpPRUTS3Pjx47e/8847rcrKyigpKcn44IMPWh1xxBG7Y8958NGdoohIijvnnHN6v/POO7nbtm3L6tSp07Drr7/+i7KyMgO49tprNx911FGlp556atHAgQOHZGRkcPHFF28+5phjShMddzLSy/siIg1Q/eX9RLySEaaD/eV93SmKiISoKROYhE/PFEVERDwlRREREU9JUURExFNSFBER8ZQURUREPCVFEZEUF6vrqBtvvLHTwIEDBw8cOHBwv379hmRmZh69cePGzKaOMxXoPUURkQao/p5i8aurO1aWVoT2ultGTmZ561N7Rn3N4+WXX26Vm5tbedlll/Vevnz5x9Gmfeyxx/LuvvvuTu+8886ymsbrPUUREQlNZWlFVpuz+4TWddT2F1Y2uOuoSI8//ni7888/f2vDI0tPKj4VETlIlJSUZLz55pt53/nOd7YlOpZkpaQoInKQmDVrVt7RRx+9o1OnThWJjiVZKSmKiBwknnzyyXYTJkxQ0WkUeqYoInIQ2LJlS+a7776b+8wzz6xKdCzJTElRRCTFxeo6CuDRRx9t89WvfrW4devWlYmNNrnplQwRkQZIhlcywqRXMkREJDRNmcAkfKpoIyIi4ikpioiIeEqKIiIinpKiiIiIp6QoIiLiKSmKiKS4WF1HbdmyJfPkk0/uO2DAgMF9+/YdMnXq1PZNHWOq0CsZIiIhmjdvXsfS0tLQzq05OTnlJ510UtTXPCZPnlx4zTXXbLrssst61zT+zjvv7DBgwIDdr7/++oovvvgia9CgQUO/973vbc3JydGL6tUoKYqIhKi0tDTrjDPOCK3rqFdeeaXBXUeZGSUlJZmVlZUUFxdn5OXllWdnZysh1kBJUUQkzV177bWbzjjjjL6dOnUatnPnzsy///3vKzMzMxMdVlLSM0URkTT33HPP5Q0dOnT3xo0bF7/77rtLf/7zn/fYunWrzv810EYREUlzM2bMaH/++edvy8jIYOjQoXu6d+++Z9GiRTmJjisZKSmKiKS5rl277v3Xv/7VGmDt2rVZK1euzBk4cODeRMeVjPRMUUQkxcXqOur3v//9+osuuqhX//79Bzvn7Kabbiro3LlzeaLjTkZKiiIiIcrJySmPp8ZoXZYXa5p//vOfUTsO7tWrV9l//vOf5WHFlM6UFEVEQhTrnUJJbnqmKCIi4ikpioiIeEqKIiIinpKiiIiIp6QoIiLiKSmKiKS4WF1Hbd68OfO00047vH///oOPOOKIQe+9955as6mFXskQEQnRylV3dywvLwnt3JqVlVvep/ePG9R11P/8z/90HjZs2K45c+Z8/sEHH+RcddVVPd5+++1lYcWYTpQURURCVF5ektW/369D6zpq2fLfN7jrqM8++yzn+uuv3wBw5JFHlhYUFDRbu3ZtVvfu3dWqTTUqPhURSXNDhw7d/dRTT7UFmDt3bsv169c3z8/PrzWJHsyUFEVE0twtt9yyvqioKHPgwIGDp06d2mngwIG7MjMz1clwDVR8KiKS5tq1a1f59NNP5wNUVlbSvXv3IwYOHLgnwWElJd0pioikucLCwszS0lIDmDJlyqHHHntsSbt27SoTHVcy0p2iiEiKi9V11IcffphzxRVX9Abo37//7kcffTQ/oQEnMSVFEZEQZWXllsdTY7Quy4s1Tayuo0499dSd+fn5S8KKKZ0pKYqIhCjWO4WS3PRMUURExFNSFBER8ZQURUREPCVFERERT0lRRETEU1IUEUlxK1asyD7uuOP6H3744UP69u075He/+13H6tNUVlZy6aWXdu/Ro8fQ/v37D37rrbdaJiLWZKdXMkREQvSnVRs6FpVXhHZuzcvKLP9578OivuaRnZ3Nn/70p4ITTjhh17Zt2zKOPPLIwWPHji0++uijS6umeeqpp/JWrlyZk5+fv2Tu3LmHXHXVVT0WL178aVhxpgslRRGREBWVV2Td0q9raF1H/Wb5upgNAfTs2bOsZ8+eZQBt27atPPzww3evWbOmWWRSfP7559tcdNFFWzIyMjjllFN2FhcXZ61evTq7aj4JqPhURCSNfPbZZ82WLl3a8mtf+9qOyOHr16/P7tWr196q7507d967evXq7KaPMLkpKYqIpImioqKMb37zm4fffvvta9Xgd/0oKYqIpIE9e/bYWWeddfj555+/ddKkSdurj+/cuXNZZMfC69evb6ai0wMpKYqIpLjKykomTpzYs3///qU33XTTxpqmGTdu3PZHH320fWVlJa+99tohubm5FUqKB1JFGxGRFDdnzpxWzz33XPt+/frtHjhw4GCAm2++ed3q1aubQdB91IQJE4pefPHFvJ49ew5t0aJF5bRp0/ITGnSSUlIUEQlRXlZmeTw1RuuyvFjTnH766TuccwujTZORkcHMmTPXhBVXulJSFBEJUax3CiW56ZmiiIiIp6QoIiLiKSmKiDRMZWVlpSU6iDD433FQv9+opCgi0jBLNm/enDUE+ewAAABiSURBVJfqibGystI2b96cByxJdCyJpIo2IiINUF5efsWGDRumbdiwYSipfaNRCSwpLy+/ItGBJJI55xIdg4iISFJI5asaERGRUCkpioiIeEqKIiIinpKiiIiIp6QoIiLi/X+VMaupR1t5WQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "plot:  p_inliers_all\n"
     ]
    },
    {
     "data": {
      "image/png": "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SkpKSvI/++yzkWZW179//8KUBZciaZ2PSUQkDBYuXFh44IEHhn5IokQtXLhw7wMPPLB/uuPYXWrKExEJgXjTXoA39cWwYcOGDxo0aMShhx46NJXxpZKa8kREorw746keleVbg5v2Yq+ONUecfV6Lpr3YsGFD5tVXX9139uzZSwcPHly1evXqNvv93WbfmIjI7qos35p1zKQfBDbtxbypf2vxtBcPPfRQ11NOOWXz4MGDqwAKCgpC0yEjaGrKExFpBZYsWZK7efPmrMMOO2zoiBEj9n/ggQe6pTumZNEZk4hIK1BTU2Offvpph7feemtJeXl5xtixY4cdffTRW0eNGpXq++mSTolJRKQV6N27d1W3bt1q8vLy6vLy8uoOP/zwsgULFnRoi4lJTXkiIq3A2WefveW9997rWF1dTVlZWcbHH3/c8YADDtie7riSQWdMIiIhcNpppw147733Om3evDmrZ8+eo2644YZvqqurDeC6664rPvjggyuOO+64kmHDho3IyMjgggsuKD700EMr0h13MugGWxHZ40XfYJuO7uJBau032OqMSUQkSiqTiOxK15hERCRUlJhERCRUlJhERCRUlJhERCRUlJhERCRUlJhEREIg3rQXN998c89hw4YNHzZs2PDBgwePyMzMPGTdunWZqY4zFXQfk4js8aLvYyp9dUWPuorawG6nycjNrMk7rl/MLuivvPJKx06dOtVdfPHFA5YuXfpFrLJPPvlk/n333dfzvffeW9LYet3HJCLSxtRV1GZ1PnVgYNNebHlxWYunvYj01FNPdZ0wYcKmlkcWTmrKExFpRcrKyjLefPPN/O9///ub0x1LsigxiYi0ItOnT88/5JBDtvbs2bM23bEkixKTiEgr8swzz3SdOHFim23GA11jEhFpNTZu3Jj5/vvvd3ruueeWpzuWZFJiEhEJgXjTXgBMmzat87e//e3SvLy8uvRGm1zqLi4ie7wwdBcPkrqLi4i0MalMIrIrdX4QEZFQUWISEZFQUWISEZFQUWISEZFQUWISEZFQUWISEQmBeNNebNy4MfPYY48dNHTo0OGDBg0ace+993ZLdYypou7iIiJR5s2b16OioiKw78fc3NyaY445JmYX9MmTJ2+4+uqr11988cUDGlt/5513dh86dOj2119//etvvvkma//99x95+eWXb8rNzW1zN6MqMYmIRKmoqMg68cQTA5v2Yvbs2S2e9sLMKCsry6yrq6O0tDQjPz+/Jjs7u80lJVBiEhFpFa677rr1J5544qCePXuOKi8vz3z44YeXZWa2yQlsdY1JRKQ1eP755/NHjhy5fd26dZ++//77i37yk5/03bRpU5v8Dm+Tb0pEpK2ZOnVqtwkTJmzOyMhg5MiRlX369KlcuHBhbrrjSgYlJhGRVqCgoKDqX//6Vx7AqlWrspYtW5Y7bNiwqnTHlQy6xiQiEgLxpr34zW9+s+b888/vP2TIkOHOObvllluKevXqVZPuuJNBiUlEJEpubm5NIj3pmlNfvDIvvPBCzMn/+vfvX/3OO+8sDSqmMFNiEhGJEu+eI0kuXWMSEZFQUWISEZFQUWISEZFQUWISEZFQUWISEZFQUWISEQmBeNNeFBcXZx5//PH7DRkyZPgBBxyw/wcffNAmR30AdRcXEdnFsuX39aipKQvs+zErq1PNwAE/btG0F7/4xS96jRo1atucOXP+8/HHH+deeeWVfd99990lQcUYJkpMIiJRamrKsoYM/nlg014sWfqbFk978dVXX+XecMMNawFGjx5dUVRU1G7VqlVZffr0aXOjP6gpT0SkFRg5cuT2Z599tgvA3LlzO6xZsyansLCwyUTWmikxiYi0ArfddtuakpKSzGHDhg2/9957ew4bNmxbZmamJgoUEZH06Nq1a92MGTMKAerq6ujTp88Bw4YNq0xzWEmhMyYRkVZgw4YNmRUVFQZwzz337H3YYYeVde3atS7dcSWDzphEREIg3rQXn3zySe6ll146AGDIkCHbp02bVpjWgJNIiUlEJEpWVqeaRHrSNae+eGXiTXtx3HHHlRcWFn4eVExhpsQkIhIl3j1Hkly6xiQiIqGixCQiIqGixCQiIqGixCQiIqGixCQiIqGixCQiEgJff/119uGHHz5kv/32GzFo0KARv/rVr3pEl6mrq+Oiiy7q07dv35FDhgwZ/vbbb3dIR6zJpu7iIiJRfr98bY+SmtrAvh/zszJrfjJgn5hd0LOzs/n9739fdNRRR23bvHlzxujRo4effPLJpYccckhFfZlnn302f9myZbmFhYWfz507d68rr7yy76effvplUHGGhRKTiEiUkprarNsGFwQ27cX/Ll0d92bdfv36Vffr168aoEuXLnX77bff9pUrV7aLTEwzZ87sfP7552/MyMhg/Pjx5aWlpVkrVqzIrt+urVBTnohIyHz11VftFi1a1OE73/nO1sjla9asye7fv39V/fNevXpVrVixIjv1ESaXEpOISIiUlJRk/Nd//dd+d9xxx6q2OkhrPEpMIiIhUVlZaaeccsp+EyZM2DRp0qQt0et79epVHTk54Jo1a9q1tWY8UGISEQmFuro6zj333H5DhgypuOWWW9Y1Vub000/fMm3atG51dXW89tpre3Xq1Km2LSYmdX4QEQmBOXPmdHz++ee7DR48ePuwYcOGA9x6662rV6xY0Q68qS8mTpxY8tJLL+X369dvZPv27eseeuihwrQGnSRKTCIiUfKzMmsS6UnXnPrilTnhhBO2Ouc+jFUmIyODxx9/fGVQcYWVEpOISJR49xxJcukak4iIhIoSk4iIhIoSk4gI1NXV1Vm6gwiC/z5a9f1PSkwiIvB5cXFxfk7f9FIAAABiSURBVGtPTnV1dVZcXJwPfJ7uWFpCnR9EZI9XU1Nz6dq1ax9au3btSFr3D/Y64POamppL0x1IS5hzLt0xiIiINGjNvwxERKQNUmISEZFQUWISEZFQUWISEZFQUWISEZFQ+f9Uxo+f913l5wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plotHist(vect, title='untitled', label='', range=None, plot=True):\n",
    "    import matplotlib.pyplot as plt\n",
    "    rng = np.random.RandomState(10)  # deterministic random data\n",
    "#     a = np.hstack((rng.normal(size=1000),\n",
    "#                    rng.normal(loc=5, scale=2, size=1000)))\n",
    "    plt.hist(vect, bins='auto', alpha=0.5, histtype=u'step', range=range, label=label)  # arguments are passed to np.histogram\n",
    "    plt.title(title)\n",
    "    pass\n",
    "\n",
    "plot_task = ['inliersThds_all', 'matchesThds_all', 'p_inliers_all']\n",
    "# plot_task = ['p_inliers_all']\n",
    "    \n",
    "# plot the histograms\n",
    "for folder in folders:\n",
    "    exp_results = inliers_exp[folder]\n",
    "    # all inliers\n",
    "#     print(list(exp_results))\n",
    "    # get number of inliers under different scores\n",
    "    def plotTask(task):\n",
    "        print(\"plot: \", task)\n",
    "        inliersThds_all = exp_results[task]\n",
    "        inliersThds_all = np.array(inliersThds_all)\n",
    "    #     print(\"inliersThds_all: \", inliersThds_all.shape)\n",
    "        for i in range(inliersThds_all.shape[1]):\n",
    "            plotHist(inliersThds_all[:,i], label=str(threshs[i]), title=folder + \"/ \" + task)\n",
    "        plt.legend(loc='upper right')\n",
    "        plt.show()\n",
    "    # plot histograms\n",
    "    for task in plot_task:\n",
    "        plotTask(task)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## matching score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "folder:  superpoint_coco40_15_170k_hpatches_nms4_det0.015\n",
      "num_points_shared:  (580, 1)\n",
      "inliersThds_all:  (580, 20)\n",
      "mscore_m:  [0.00000000e+00 0.00000000e+00 0.00000000e+00 1.03602942e-05\n",
      " 4.48625494e-04 3.26124666e-03 1.17885498e-02 3.55604519e-02\n",
      " 8.72992789e-02 1.78964613e-01 2.87899921e-01 3.65574456e-01\n",
      " 3.88696940e-01 3.88734048e-01 3.88734048e-01 3.88734048e-01\n",
      " 3.88734048e-01 3.88734048e-01 3.88734048e-01 3.88734048e-01]\n",
      "mscore:  [[0.         0.         0.         ... 0.18899522 0.18899522 0.18899522]\n",
      " [0.         0.         0.         ... 0.25968992 0.25968992 0.25968992]\n",
      " [0.         0.         0.         ... 0.63874346 0.63874346 0.63874346]\n",
      " ...\n",
      " [0.         0.         0.         ... 0.27242525 0.27242525 0.27242525]\n",
      " [0.         0.         0.         ... 0.56453559 0.56453559 0.56453559]\n",
      " [0.         0.         0.         ... 0.74812968 0.74812968 0.74812968]]\n",
      "num_points_shared:  [339.60172414]\n",
      "inliersThds_all:  [0.00000000e+00 0.00000000e+00 0.00000000e+00 3.44827586e-03\n",
      " 1.39655172e-01 1.07758621e+00 3.91724138e+00 1.18827586e+01\n",
      " 2.94448276e+01 6.09344828e+01 9.88051724e+01 1.25765517e+02\n",
      " 1.33663793e+02 1.33674138e+02 1.33674138e+02 1.33674138e+02\n",
      " 1.33674138e+02 1.33674138e+02 1.33674138e+02 1.33674138e+02]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "titles = ['keypoints', 'warped_keypoints', 'unwarped_keypoints', \n",
    "          'average over keypoints and unwarped keypoints']\n",
    "\n",
    "for folder in folders:\n",
    "#     f_idx = folder \n",
    "    print(\"folder: \", folder)\n",
    "    num_points = all_num_points[f_idx]\n",
    "    num_points_shared = num_points[:,3] # get points in shared region\n",
    "    num_points_shared = num_points_shared[:,np.newaxis]\n",
    "    num_points_shared[num_points_shared == 0] = 1\n",
    "    print(\"num_points_shared: \", num_points_shared.shape)    \n",
    "    exp_results = inliers_exp[folder]\n",
    "    inliersThds_all = exp_results['inliersThds_all']\n",
    "    inliersThds_all = np.array(inliersThds_all)\n",
    "    print(\"inliersThds_all: \", inliersThds_all.shape)\n",
    "    mscore = inliersThds_all/num_points_shared\n",
    "    mscore_m = mscore.mean(axis=0)\n",
    "    print(\"mscore_m: \", mscore_m)\n",
    "    print(\"mscore: \", mscore)\n",
    "    print(\"num_points_shared: \", num_points_shared.mean(axis=0))    \n",
    "    print(\"inliersThds_all: \", inliersThds_all.mean(axis=0))\n",
    "    \n",
    "    # plot curve\n",
    "    plt.plot(threshs, mscore_m)\n",
    "    plt.title(folder + \": threshs-mscore_m\")\n",
    "    plt.show()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plot mscore_m - threshs\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mscores_all:  580\n",
      "mscores_all:  (175, 3)\n",
      "inliers_all:  (175,)\n",
      "threshs:  [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8\n",
      " 1.9 2. ]\n",
      "folder:  superpoint_coco40_15_170k_hpatches_nms4_det0.015\n",
      "mAP under thd [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8\n",
      " 1.9 2. ] = [0.         0.         0.         0.00344828 0.05862069 0.23482656\n",
      " 0.40558655 0.57905532 0.72764283 0.77903487 0.78069811 0.74917018\n",
      " 0.73153206 0.73149209 0.73149209 0.73149209 0.73149209 0.73149209\n",
      " 0.73149209 0.73149209]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def computeAP(m_test, m_score, verbose=False):\n",
    "    from sklearn.metrics import average_precision_score\n",
    "\n",
    "    average_precision = average_precision_score(m_test, m_score)\n",
    "    if verbose:\n",
    "        print('Average precision-recall score: {0:0.2f}'.format(\n",
    "        average_precision))\n",
    "    return average_precision\n",
    "\n",
    "def selectwThd(m_score, inliers, thd=0.8):\n",
    "    mask = m_score < thd\n",
    "    # m_score_mask = np.select([mask])\n",
    "    m_score_mask = m_score[mask,]\n",
    "    inliers = inliers[mask,]\n",
    "    return m_score_mask, inliers\n",
    "    \n",
    "\n",
    "def flipArr(arr):\n",
    "    return arr.max() - arr\n",
    "\n",
    "\n",
    "print(\"mscores_all: \", len(mscores_all))\n",
    "print(\"mscores_all: \", mscores_all[0].shape)\n",
    "print(\"inliers_all: \", inliers_all[0].shape)\n",
    "\n",
    "thds = threshs\n",
    "print(\"threshs: \", thds)\n",
    "seq_len = len(inliers_all)\n",
    "average_precision = np.zeros((seq_len, len(thds)))\n",
    "\n",
    "for folder in folders:\n",
    "    exp_results = inliers_exp[folder]\n",
    "    mscores_all = exp_results['mscores_all']\n",
    "    inliers_all = exp_results['inliers_all']\n",
    "    print(\"folder: \", folder)\n",
    "    for i in range(seq_len):\n",
    "    #     i = 0\n",
    "        inliers = inliers_all[i]\n",
    "#         print(\"% of inliers: \", inliers.sum()/inliers.shape[0])\n",
    "        m_score = mscores_all[i][:,2]\n",
    "        # filter using thd\n",
    "        for j in range(len(thds)):\n",
    "            thd = thds[j]\n",
    "            m_flip, m_inliers = selectwThd(m_score, inliers, thd)\n",
    "            # avoid nan in AP algorthm\n",
    "            if m_inliers.shape[0] > 0 and m_inliers.sum()>0:\n",
    "                m_flip = flipArr(m_flip)\n",
    "                # compute ap\n",
    "                ap = computeAP(m_inliers, m_flip)\n",
    "            else:\n",
    "                ap = 0\n",
    "            average_precision[i,j] = ap\n",
    "\n",
    "    print(\"mAP under thd {} = {}\".format(thds, average_precision.mean(axis=0)))\n",
    "    # plot mscore_m - threshs\n",
    "    plt.plot(threshs, average_precision.mean(axis=0))\n",
    "    plt.title(folder + \": threshs-NNmAP\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotAP(y_test, y_score, ap):\n",
    "\n",
    "    from sklearn.metrics import precision_recall_curve\n",
    "    import matplotlib.pyplot as plt\n",
    "    from sklearn.utils.fixes import signature\n",
    "\n",
    "    precision, recall, _ = precision_recall_curve(y_test, y_score)\n",
    "\n",
    "    # In matplotlib < 1.5, plt.fill_between does not have a 'step' argument\n",
    "    step_kwargs = ({'step': 'post'}\n",
    "                   if 'step' in signature(plt.fill_between).parameters\n",
    "                   else {})\n",
    "    plt.step(recall, precision, color='b', alpha=0.2,\n",
    "             where='post')\n",
    "    plt.fill_between(recall, precision, alpha=0.2, color='b', **step_kwargs)\n",
    "\n",
    "    plt.xlabel('Recall')\n",
    "    plt.ylabel('Precision')\n",
    "    plt.ylim([0.0, 1.05])\n",
    "    plt.xlim([0.0, 1.0])\n",
    "    plt.title('2-class Precision-Recall curve: AP={0:0.2f}'.format(\n",
    "              ap))\n",
    "    plt.show()\n",
    "    \n",
    "# thd = 1.5\n",
    "# mask = m_score < thd\n",
    "# m_score = max(0., thd - m_score)\n",
    "# plotAP(inliers, m_score, ap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test thd:  0.7\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test thd:  0.8\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test thd:  0.9\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAG2VJREFUeJzt3X20XHV97/H3x4QHlRiqAR9CIIpQjYqiKei1VVopAlfApa1CRaWlpLaltbfWXnvbq5HWWutVr16xSosXRRTBZW2soVgVRa3YhAtSHoqNCCagFQSCPMiDfO8fex8zHs7ZZ84h+8wkeb/WOuvM7P2bPd/5zcz+7P3bM3tSVUiSNJ2HjLoASdJ4MygkSZ0MCklSJ4NCktTJoJAkdTIoJEmdDIptWJITknxl1HVsbUmuSHLIDG32TnJ7kgXzVFbvklyb5ND28uokHxl1TRIYFPMuyS5JTk9yXZIfJrk0yRGjrmsY7YrsrnYF/Z9Jzkiy29a+n6p6SlV9cYY236mq3arqx1v7/tuV9L3t47w1yb8kec7Wvp8dRfs6uS/JYydN3yr9nOTX2vfTHUk+leSRHW2PSnJ5e5//kmTFwLxdkrwryQ1JbknyviQ7zbae7ZFBMf8WAhuB5wOLgT8DzkmyfIQ1zcZRVbUb8ExgJU39PyWNbf219fH2cS4BLgDOHXE9W12ShfNwHw8HXgpsBo6foslEP+8BfAX4ZJLMYvlPAT4AvBJ4NHAn8L5p2u4HnAW8Btgd+DSwZqAf3kDzmn4qsD/Na/wBr+8d0bb+Zt7mVNUdVbW6qq6tqvur6h+BbwPPmu42SZYl+WSSG5P8IMl7p2n37iQbk9yW5OIkvzAw76Ak69t5/5nkne30XZN8pF3urUnWJXn0EI/jeuA8mjcVSb6Y5C1JvkrzZn1CksXt3tN3k1yf5C8Gh4qSnJTkqnbP6sokz2ynDw7BTFf38iQ18SZP8rgka5LcnGRDkpMG7md1knOSfLi9ryuSrJzpMbaP8z6alcvSJHsMLPNF7d7gxJbwAQPzpny+kuyb5AvttJuSnJVk92HqmCzJMe3935bkW0kOn9x3A4/9I5P67MQk3wG+kOS8JCdPWvY3krykvfykJP/c9uvVSV42y1JfCtwKnAK8erpGVXUv8CHgMcCjZrH8VwCfrqoLq+p24H8CL0myaIq2LwS+XFVfaZ/XtwFLaTbaAI4C3lNVN1fVjcB7gN+YRS3bLYNixNqV8v7AFdPMXwD8I3AdsJzmhX32NItbBzwDeCTwUeDcJLu2894NvLuqHgHsC5zTTn81zZ7NMpo36GuAu4aoexlwJHDJwORXAquARW29ZwD3AU8EDgQOA36zvf2vAquBVwGPAI4GfjDFXU1X92RnA5uAxwG/Avxlkl8amH9022Z3YA0wZdhO8Th3bmv8AXBLO+1A4IPAb9H02Qdotkx3meH5CvDWtsYn0/T56mHqmFTTQcCHgde3j+d5wLWzWMTz2/t/IfAx4LiBZa8A9gE+0+4N/DPNa2lP4FjgfW2biSGfy2a4r1e393E28KQkU24QJdkFOAHYWFU3Jfn5NoSn+/v59qZPAb4xsZyq+hZwD817asq7mnQ5tBs708zfK8niGR7j9q+q/BvRH7AT8DngAx1tngPcCCycYt4JwFc6bnsL8PT28oXAm4Elk9r8BvAvwAFD1HstcDvNFuJ1NLv4D23nfRE4ZaDto4G7J+a3044DLmgvnw+8tuN+Dp2h7uVA0QzlLQN+DCwamP9W4Iz28mrgcwPzVgB3dTzO1TQrm1vb5f4AOGRg/t8Afz7pNlfTrICnfb6muJ8XA5dM87hXAx+Z5nYfAN41U99NXs5Anz1hYP4i4A5gn/b6W4APtpdfTrMFPvm+3zTk63tv4H7gGQPP+bun6efvA18AnjXL99DngddMmnb94PM1MP1J7WM9BNiZZu/jfuBP2vl/AXyVZhjsMcDX2/567Gxq2h7/3KMYkTRj+GfSvFFOHph+XpoDbbcneQXNSvC6anaVZ1rmH7VDOZuT3Eqzp7CknX0izVbWv7fDSy9qp59J8wY+O81BvL9O9wG8F1fV7lW1T1X9TlUN7n1sHLi8D00QfndiK5BmJbNnO38Z8K2ZHlNH3YMeB9xcVT8cmHYdzdb8hO8NXL4T2DXJwiSvGOjv8wbanFNVu9ME3uX89NDgPsDrBrdw28fzODqerySPTnJ2Owx3G/ARtjw/szFs303nJ89T22efodlbgCbMz2ov7wMcPOlxvoJmJTqMVwJXVdWl7fWzgF+b9Po6p3097VlVv1RVF8/ysdxOs0c66BHADyc3rKp/p9nDeS/wXZq+v5JmTxSakLwEuJRm4+lTwL3Af86ypu1O7wez9EBJApxOsxI6sprxWQCq6ohJbZ8D7J1kYVdYpDke8cfAC4Arqur+JLfQ7kpX1X8Ax7UB9RLgE0keVVV30GyxvznNAfW1NFvHp8/hoQ2eingjzR7Fkmnq3kgzlNS9wGnqntTsBuCRSRYNhMXeNFuWMy3/LLasGKeaf1OSVcD6JB+tqu+2tb+lqt4yuf0Mz9df0vTR06rq5iQvZsghsEm6+u4O4GED16daqU8+ZfTHgDcluRDYlebg/cT9fKmqfnkONUIzZLd3komQXkgzVHck8A9dN2xfz+d1NDmiqr5MM2T79IHbPQHYBfjmVDeqqk8An2jb7k6zIbKunXcXzUbbye38VcDFVXV/56PcAbhHMRp/QzNGfNSkLfKp/CvN1s9fJXl4moPPz52i3SKa4wE3AguTvJGBLa0kxyfZo33R39pOvj/JLyZ5Wju2fhvNFtSDfmO0K9TPAu9I8ogkD2kP5k4cOPw74I+SPCuNJybZZ/Jypqt70n1tpNkCfGvbPwfQrAC2yvcQqupqmr2uP24n/S3wmiQHt7U/PMl/bQ+gdj1fi2i2gDcnWUpzjGEuTgd+PckL2n5dmuRJ7bxLgWOT7JTmgP2vDLG8tTR7D6fQfAppon//Edg/ySvb5e2U5OeSPHmmBbaBuS9wEM1xs2fQHAv4KE2AdKqqL1fz8efp/r7cNj0LOCrJL7THVE4BPjlp73KwrmclWZDmgwmnAWvaPQ3afnxc+5w+m2Zo6k0z1bojMCjmWbsy/C2aN873Jg0zPUA13xM4iuaA8HdodpNfPkXT84F/otmSug74ET89FHQ4cEWS22kOEB/bhtRjaLawbgOuAr5EMxy1NbyKZiz4SprjJZ8AHts+rnNpdvU/SjNM8Cmag/CTTVf3ZMfRjMHfAPw9zTj657bS4wB4O7AqyZ5VtR44iWZv4BZgA83xopmerzfTfORyM81wzyfnUkhV/Svw68C72mV9iWZFD83Kbd+2rjfT9O9My7u7reXQwfbtyvYwmmGpG2iG795Gs8VOO2w35YcwaIZ4/qGq/q2qvjfxR/Mcvigd33WYjaq6guYDGGfRHOdYBPzOxPw0Q7n/Y+Am76bZ4Liapo9OGpi3L80Gxx00n8B6Q1V9dmvUua1LlT9cJEmannsUkqROBoUkqZNBIUnqZFBIkjptc9+jWLJkSS1fvnzUZUjSNuXiiy++qar2mLnlA21zQbF8+XLWr18/6jIkaZuS5Lq53tahJ0lSJ4NCktTJoJAkdTIoJEmdDApJUieDQpLUqbegSPLBJN9Pcvk085PkPWl+3/iytL+XLEkaL33uUZxBc4ro6RwB7Nf+raL5jQZJ0pjp7Qt3VXVh+4tp0zkG+HA15zm/KMnuSR7b/uDNtH70I/jmlL9dJW3fHvlIWDKXH06VHqRRfjN7KT/9wzqb2mkPCIr2JwlXASxZ8gQuvHBe6pPGxt13N0Fx3HGjrkQ7om3iFB5VdRrNzxay//4r68ADR1yQNM+uuw5uvnnUVWhHNcpPPV0PLBu4vlc7TZI0Rka5R7EGODnJ2cDBwOaZjk9I0ijcdNOOvUfXW1Ak+RhwCLAkySbgTcBOAFX1fmAtcCTND9PfSfNj8ZK2UdvzyvSHP4RLL4WqUVfyYCx6+Fxv2eennjoPu7Wfdvrdvu5f2lGMywp6+1iZTm+XXWDFilFX8WAsWDDXW24TB7MlNZ98muqj4eO0gt72V6aaikEhbQMWL4bvfY9pPxruClp9MiikbcDuu8PBB4+6Cu2oPCmgJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpU69BkeTwJFcn2ZDkDVPM3zvJBUkuSXJZkiP7rEeSNHu9BUWSBcCpwBHACuC4JCsmNfsz4JyqOhA4FnhfX/VIkuamzz2Kg4ANVXVNVd0DnA0cM6lNAY9oLy8GbuixHknSHCzscdlLgY0D1zcBB09qsxr4bJLfAx4OHDrVgpKsAlYB7Lnn3lu9UEnS9EZ9MPs44Iyq2gs4EjgzyQNqqqrTqmplVa1cvHiPeS9SknZkfQbF9cCyget7tdMGnQicA1BVXwN2BZb0WJMkaZb6DIp1wH5JHp9kZ5qD1WsmtfkO8AKAJE+mCYobe6xJkjRLvQVFVd0HnAycD1xF8+mmK5KckuTottnrgJOSfAP4GHBCVVVfNUmSZq/Pg9lU1Vpg7aRpbxy4fCXw3D5rkCQ9OKM+mC1JGnMGhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqtHDYhkmWAvsM3qaqLuyjKEnS+BgqKJK8DXg5cCXw43ZyAZ1BkeRw4N3AAuDvquqvpmjzMmB1u7xvVNWvDVu8JKl/w+5RvBj42aq6e9gFJ1kAnAr8MrAJWJdkTVVdOdBmP+BPgOdW1S1J9hy+dEnSfBj2GMU1wE6zXPZBwIaquqaq7gHOBo6Z1OYk4NSqugWgqr4/y/uQJPVs2D2KO4FLk3we+MleRVX9fsdtlgIbB65vAg6e1GZ/gCRfpRmeWl1V/zRkTZKkeTBsUKxp//q4//2AQ4C9gAuTPK2qbh1slGQVsApgzz337qEMSdJ0hgqKqvpQkp1p9wCAq6vq3hludj2wbOD6Xu20QZuAr7fL+naSb9IEx7pJ938acBrA/vuvrGFqliRtHUMdo0hyCPAfNAen3wd8M8nzZrjZOmC/JI9vQ+ZYHrhX8imavQmSLKEJomuGLV6S1L9hh57eARxWVVcDJNkf+BjwrOluUFX3JTkZOJ/m+MMHq+qKJKcA66tqTTvvsCQTH7t9fVX9YO4PR5K0tQ0bFDtNhARAVX0zyYyfgqqqtcDaSdPeOHC5gD9s/yRJY2jYoFif5O+Aj7TXXwGs76ckSdI4GTYofhv4XWDi47BfpjlWIUnazg37qae7gXe2f5KkHUhnUCQ5p6peluTfaM7F9FOq6oDeKpMkjYWZ9ihe2/5/Ud+FSJLGU+f3KKrqu+3Fm4CNVXUdsAvwdOCGnmuTJI2BYU8KeCGwa/ubFJ8FXgmc0VdRkqTxMWxQpKruBF4CvK+qfhV4Sn9lSZLGxdBBkeQ5NN+f+Ew7bUE/JUmSxsmwQfEHND8w9PftaTieAFzQX1mSpHEx7PcovgR8aeD6NWz58p0kaTs20/co/ndV/UGSTzP19yiO7q0ySdJYmGmP4sz2///quxBJ0njqDIqquri9uB64q6ruB0iygOb7FJKk7dywB7M/Dzxs4PpDgc9t/XIkSeNm2KDYtapun7jSXn5YR3tJ0nZi2KC4I8kzJ64keRZwVz8lSZLGybC/R/EHwLlJbgACPAZ4eW9VSZLGxrDfo1iX5EnAz7aTrq6qe/srS5I0LoYaekryMOC/A6+tqsuB5Uk89bgk7QCGPUbxf4F7gOe0168H/qKXiiRJY2XYoNi3qv4auBegPZNseqtKkjQ2hg2Ke5I8lPY0Hkn2Be7urSpJ0tgY9lNPbwL+CViW5CzgucAJfRUlSRofMwZFkgD/TvOjRc+mGXJ6bVXd1HNtkqQxMGNQVFUlWVtVT2PLjxZJknYQwx6j+H9Jfq7XSiRJY2nYYxQHA8cnuRa4g2b4qarqgL4KkySNh2GD4oW9ViFJGlsz/cLdrsBrgCcC/wacXlX3zUdhkqTxMNMxig8BK2lC4gjgHb1XJEkaKzMNPa1oP+1EktOBf+2/JEnSOJlpj+InZ4h1yEmSdkwzBcXTk9zW/v0QOGDicpLbZlp4ksOTXJ1kQ5I3dLR7aZJKsnK2D0CS1K/OoaeqWjDXBSdZAJwK/DKwCViXZE1VXTmp3SLgtcDX53pfkqT+DPuFu7k4CNhQVddU1T3A2cAxU7T7c+BtwI96rEWSNEd9BsVSYOPA9U3ttJ9of4d7WVV1nhokyaok65Os37z5xq1fqSRpWn0GRackDwHeCbxuprZVdVpVrayqlYsX79F/cZKkn+gzKK4Hlg1c36udNmER8FTgi+2pQZ4NrPGAtiSNlz6DYh2wX5LHJ9kZOBZYMzGzqjZX1ZKqWl5Vy4GLgKOran2PNUmSZqm3oGi/d3EycD5wFXBOVV2R5JQkR/d1v5KkrWvYkwLOSVWtBdZOmvbGadoe0mctkqS5GdnBbEnStsGgkCR1MigkSZ0MCklSJ4NCktTJoJAkdTIoJEmdDApJUieDQpLUyaCQJHUyKCRJnQwKSVIng0KS1MmgkCR1MigkSZ0MCklSJ4NCktTJoJAkdTIoJEmdDApJUieDQpLUyaCQJHUyKCRJnQwKSVIng0KS1MmgkCR1MigkSZ0MCklSJ4NCktTJoJAkdTIoJEmdDApJUqdegyLJ4UmuTrIhyRummP+HSa5MclmSzyfZp896JEmz11tQJFkAnAocAawAjkuyYlKzS4CVVXUA8Angr/uqR5I0N33uURwEbKiqa6rqHuBs4JjBBlV1QVXd2V69CNirx3okSXPQZ1AsBTYOXN/UTpvOicB5U81IsirJ+iTrN2++cSuWKEmayVgczE5yPLASePtU86vqtKpaWVUrFy/eY36Lk6Qd3MIel309sGzg+l7ttJ+S5FDgT4HnV9XdPdYjSZqDPvco1gH7JXl8kp2BY4E1gw2SHAh8ADi6qr7fYy2SpDnqLSiq6j7gZOB84CrgnKq6IskpSY5um70d2A04N8mlSdZMszhJ0oj0OfREVa0F1k6a9saBy4f2ef+SpAdvLA5mS5LGl0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKmTQSFJ6mRQSJI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqZNBIUnqZFBIkjoZFJKkTgaFJKlTr0GR5PAkVyfZkOQNU8zfJcnH2/lfT7K8z3okSbPXW1AkWQCcChwBrACOS7JiUrMTgVuq6onAu4C39VWPJGlu+tyjOAjYUFXXVNU9wNnAMZPaHAN8qL38CeAFSdJjTZKkWVrY47KXAhsHrm8CDp6uTVXdl2Qz8CjgpsFGSVYBq9pr965c+TPX9lLxNufuxbDL5lFXMR7siy3siy3siy1u22uut+wzKLaaqjoNOA0gyfqqW1aOuKSx0PTFnfYF9sUg+2IL+2KLJOvnets+h56uB5YNXN+rnTZlmyQLgcXAD3qsSZI0S30GxTpgvySPT7IzcCywZlKbNcCr28u/AnyhqqrHmiRJs9Tb0FN7zOFk4HxgAfDBqroiySnA+qpaA5wOnJlkA3AzTZjM5LS+at4G2Rdb2Bdb2Bdb2BdbzLkv4ga8JKmL38yWJHUyKCRJncY2KDz9xxZD9MUfJrkyyWVJPp9kn1HUOR9m6ouBdi9NUkm2249GDtMXSV7WvjauSPLR+a5xvgzxHtk7yQVJLmnfJ0eOos6+Jflgku8nuXya+UnynrafLkvyzKEWXFVj90dz8PtbwBOAnYFvACsmtfkd4P3t5WOBj4+67hH2xS8CD2sv//aO3Bdtu0XAhcBFwMpR1z3C18V+wCXAz7TX9xx13SPsi9OA324vrwCuHXXdPfXF84BnApdPM/9I4DwgwLOBrw+z3HHdo/D0H1vM2BdVdUFV3dlevYjmOyvbo2FeFwB/TnPesB/NZ3HzbJi+OAk4tapuAaiq789zjfNlmL4o4BHt5cXADfNY37ypqgtpPkE6nWOAD1fjImD3JI+dabnjGhRTnf5j6XRtquo+YOL0H9ubYfpi0Ik0Wwzboxn7ot2VXlZVn5nPwkZgmNfF/sD+Sb6a5KIkh89bdfNrmL5YDRyfZBOwFvi9+Slt7Mx2fQJsI6fw0HCSHA+sBJ4/6lpGIclDgHcCJ4y4lHGxkGb46RCavcwLkzytqm4daVWjcRxwRlW9I8lzaL6/9dSqun/UhW0LxnWPwtN/bDFMX5DkUOBPgaOr6u55qm2+zdQXi4CnAl9Mci3NGOya7fSA9jCvi03Amqq6t6q+DXyTJji2N8P0xYnAOQBV9TVgV2DJvFQ3XoZan0w2rkHh6T+2mLEvkhwIfIAmJLbXcWiYoS+qanNVLamq5VW1nOZ4zdFVNeeToY2xYd4jn6LZmyDJEpqhqGvms8h5MkxffAd4AUCSJ9MExY3zWuV4WAO8qv3007OBzVX13ZluNJZDT9Xf6T+2OUP2xduB3YBz2+P536mqo0dWdE+G7IsdwpB9cT5wWJIrgR8Dr6+q7W6ve8i+eB3wt0n+G82B7RO2xw3LJB+j2ThY0h6PeROwE0BVvZ/m+MyRwAbgTuDXh1rudthXkqStaFyHniRJY8KgkCR1MigkSZ0MCklSJ4NCktTJoJAmSfLjJJcmuTzJp5PsvpWXf0KS97aXVyf5o625fGlrMyikB7qrqp5RVU+l+Y7O7466IGmUDAqp29cYOGlaktcnWdeey//NA9Nf1U77RpIz22lHtb+VckmSzyV59Ajqlx60sfxmtjQOkiygOe3D6e31w2jOlXQQzfn81yR5Hs05xv4M+C9VdVOSR7aL+Arw7KqqJL8J/DHNN4SlbYpBIT3QQ5NcSrMncRXwz+30w9q/S9rru9EEx9OBc6vqJoCqmvg9gL2Aj7fn+98Z+Pb8lC9tXQ49SQ90V1U9A9iHZs9h4hhFgLe2xy+eUVVPrKrTO5bzf4D3VtXTgN+iORGdtM0xKKRptL8a+PvA69pT2Z8P/EaS3QCSLE2yJ/AF4FeTPKqdPjH0tJgtp3B+NdI2yqEnqUNVXZLkMuC4qjqzPUX119qz9N4OHN+eqfQtwJeS/JhmaOoEml9VOzfJLTRh8vhRPAbpwfLssZKkTg49SZI6GRSSpE4GhSSpk0EhSepkUEiSOhkUkqROBoUkqdP/B/8YdZoRSU0nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test thd:  1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test thd:  1.2\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XuYHHWd7/H3JzO5gLmRBCIkgXCHKIiS5XJYARdEYCX4eAVFxWWJN3b1eDvuWY9GXNdVVz3sEVdYYVFEEHhcN2oQFRFEQRPkGjBsCIFccCEQArmQZJLv+eP3a6bSmanuGaamO5PP63n6me6q6upv13TXp36/urQiAjMzs94Ma3UBZmbW3hwUZmZWykFhZmalHBRmZlbKQWFmZqUcFGZmVspBsQOTdK6k21pdx0CTtFDSiQ2m2VvSWkkdg1RW5SQtlXRyvj9H0ndbXZMZOCgGnaSRki6T9Kik5yTdLem0VtfVjLwi25BX0P8t6QpJowf6dSLiZRHxqwbTPBYRoyNiy0C/fl5Jb87v8xlJv5V07EC/zs4if066JO1ZN3xAlrOkt+fv0zpJP5Q0oWTaMyTdn1/zt5Jm1I3fT9KP83dzlaQv9bWeochBMfg6gWXACcA44FPAtZKmt7CmvjgjIkYDrwJmkurfhpId/bP1/fw+JwE3A9e1uJ4BJ6lzEF7jJcCbgDXAOT1MUlvOuwO3AT+QpD7M/2XAJcA7gcnAeuAbvUx7IHAV8D5gPPAjYG5tOUgaAfwc+CXwUmAq4FYdDopBFxHrImJORCyNiK0R8WPgEeDI3p4jaZqkH0h6UtJTkr7ey3QXSVom6VlJd0p6dWHcUZIW5HH/LemrefgoSd/N831G0nxJk5t4HyuAG4CX5/n8StLnJf2G9GXdT9K43Hp6XNIKSf9Q7CqSdL6kB/PW2wOSXpWHF7tgeqt7uqQofMn3kjRX0tOSFks6v/A6cyRdK+k7+bUWSprZ6D3m99lFWrlMkbR7YZ6vz63B2pbw4YVxPf6/JO0v6Zd52CpJV0ka30wd9SSdmV//WUkPSzq1ftkV3vt365bZeZIeA34p6QZJF9TN+x5Jb8z3D5H087xcF0l6ax9LfRPwDHAh8O7eJoqIzcC3SSvoiX2Y/zuAH0XErRGxFvg/wBsljelh2tcBv46I2/L/9YvAFNJGG8C5wMqI+Gr+nj4fEff2oZYhy0HRYnmlfBCwsJfxHcCPgUeB6aQP9jW9zG4+cAQwAfgecJ2kUXncRcBFETEW2B+4Ng9/N6llM430BX0fsKGJuqcBpwN3FQa/E5gNjMn1XgF0AQcArwROAf46P/8twBzgXcBYYBbwVA8v1Vvd9a4BlgN7AW8G/lHSXxTGz8rTjAfmAj2GbQ/vc0Su8SlgdR72SuBy4L2kZXYJact0ZIP/l4Av5BoPJS3zOc3UUVfTUcB3gI/n93M8sLQPszghv/7rgKuBswvzngHsA/wktwZ+Tvos7QGcBXwjT1Pr8mm0In13fo1rgEMk9bhBJGkkaUW9LCJWSfrzHMK93f48P/VlwD21+UTEw8Am0neqx5equy/yxg5wDLA0h+eqvPFzWIP3t3OICN9adAOGA78ALimZ5ljgSaCzh3HnAreVPHc18Ip8/1bgs8Ckumn+CvgtcHgT9S4F1pK2EB8lNfF3yeN+BVxYmHYysLE2Pg87G7g5378R+FDJ65zcoO7pQJC68qYBW4AxhfFfAK7I9+cAvyiMmwFsKHmfc0grm2fyfJ8CTiyM/1fgc3XPWURaAff6/+rhdd4A3NXL+54DfLeX510CfK3RsqufT2GZ7VcYPwZYB+yTH38euDzffxtpC7z+tT/T5Od7b2ArcEThf35RL8v5CVKXz5F9/A7dBLyvbtiK4v+rMPyQ/F5PBEaQWh9bgb/L438GbAZOy+M/DiwBRvSlpqF4c4uiRZT68K8kfVEuKAy/QWlH21pJ7yCtBB+N1FRuNM+P5a6cNZKeIbUUJuXR55G2sv6Yu5den4dfSfoCXyNppaQvSRpe8jJviIjxEbFPRHwgIoqtj2WF+/uQgvDx2lYgaSWzRx4/DXi40XsqqbtoL+DpiHiuMOxR0tZ8zZ8K99cDoyR1SnpHYXnfUJjm2ogYTwq8+9m2a3Af4KPFLdz8fvai5P8labKka3I33LOk/u9J9dM1odll15sX/k95mf2E1FqAFOZX5fv7AEfXvc93kLqHmvFO4MGIuDs/vgp4e93n69r8edojIv4iIu7s43tZS2qRFo0FnqufMCL+SGrhfB14nLTsHyC1RCG1pG+LiBsiYhPwz6QW46F9rGnIqXxnlm1PkoDLSCuh0yP1zwIQEafVTXsssLekzrKwUNof8QngJGBhRGyVtJrc1I6I/wLOzgH1RuB6SRMjYh1pi/2zSjvU55G2ji/rx1srXop4GalFMamXupeRupLKZ9hL3XWTrQQmSBpTCIu9SVuWjeZ/Fd0rxp7Gr5I0G1gg6XsR8Xiu/fMR8fn66Rv8v/6RtIwOi4inJb2BJrvA6pQtu3XAroXHPa3U6y8ZfTXwGUm3AqNIO+9rr3NLRLy2HzVC6rLbW1ItpDtJK97Tgf8se2L+PN9QMslpEfFrUpftKwrP2w8YCTzU05Mi4nrg+jzteNKGyPw8+l7guPK3tHNyi6I1/pW0lXJG3RZ5T35P2vr5J0kvUdr53NOHeQxpf8CTQKekT1PY0pJ0jqTdI2IrqakPsFXSayQdlvvWnyU1vbe+qHcH5BXqz4CvSBoraZjSztzajsNvAR+TdKSSAyTtUz+f3uque61lpO6zL+TlczhpBTAgR6xExCJSq+sTedC/Ae+TdHSu/SWS/jLvQC37f40hbQGvkTSF1LXRH5cB75F0Ul6uUyQdksfdDZwlabjSDvs3NzG/eaTWw4Wko5Bqy/fHwEGS3pnnN1zSn0lquIWdA3N/4CjSfrMjSPsCvkcKkFIR8etIhz/3dvt1nvQq4AxJr877VC4EflDXuizWdaSkDqUDEy4F5uaWBqTPyzGSTs7fhw8Dq4AHG9U71DkoBlleGb6X9MX5U10303YinSdwBmmH8GOkZvLbepj0RuCnpC2pR4Hn2bYr6FRgoaS1pB3EZ+WQeilpC+tZ0hfiFlJ31EB4F6mv9wHS/pLrgT3z+7qO1B/+PVI3wQ9JO+Hr9VZ3vbNJffArgf8g9aP/YoDeB8CXgdmS9oiIBcD5pNbAamAxaX9Ro//XZ0mHFa8hdff8oD+FRMTvgfcAX8vzuoW0oofU775/ruuzpOXbaH4bcy0nF6fPK9tTSN1SK0ndd18kbbGTu+16PAiD1MXznxFxX0T8qXYj/Q9fr5JzHfoiIhaSDsC4irSfYwzwgdr43JX7vwtPuYi0wbGItIzOL8xrEekQ3m/mcWcCs3I31E5NEf7hIjMz651bFGZmVspBYWZmpRwUZmZWykFhZmaldrjzKCZNmhTTp09vdRlmZjuUO++8c1VE7N54yu3tcEExffp0FixY0OoyzMx2KJIe7e9z3fVkZmalHBRmZlbKQWFmZqUcFGZmVspBYWZmpRwUZmZWqrKgkHS5pCck3d/LeEn6F6XfN75X+feSzcysvVTZoriCdIno3pwGHJhvs0m/0WBmZm2mshPuIuLW/ItpvTkT+E6k65zfIWm8pD3zD970asMGuLOvP5Y4wCZPhqlTW1uDmdlgaeWZ2VPY9od1ludh2wVF/inK2QATJ+7HH/4A0qDUuJ0NG2D6dAeFme08dohLeETEpaSfLeTgg2fG4YdDZ4sq/+MfYcuW1rx2FVatgqefHth5RqTb1q3d92vDi8OKv5m1++4wbdrA1mFmA6OVQbECKK4apuZhVqcvK/PaynjLlnR/y5b0uHYrrqS3bIFnn033d9ml+3nFv/X3i8OK86q/1Wqp/ZW6H9dag7XhGzemoDjrrIFdbmY2MFoZFHOBCyRdAxwNrGm0f2IoKFvpb90KXV3ptmVL+rt1a1qZd3XByJGweXP3rTbN5s3dAVELg61b0zxrK+eOju7Xqf/12zFjYNiwtNKW0rTDh6f7w4alG3Q/rk1Xe1w/rq+WLEnLZenS1K1nZu2lsqCQdDVwIjBJ0nLgM8BwgIj4JjAPOJ30w/TrST8Wv0PrKQQiYNOm7pX76tVpC3r4cHj++XSrrfSLW+nFLXBIK/Pddksr8REjulfgHR3b/h22A54ZM24cLF4MN98Mp58Oa9ak4RMmwKRJra3NzKo96unsBuMD+GBVr1+ldevgoYe6H3d1pRX+qlXdW/dr16ZAqLUQtm7t3gofMyatAMePTyv4zs506+ho3U76Vpo4EQ4+GFasgNoV5IcNS8vZQWHWejvEzux2snVrCoCFC1MLYN267haDBGPHppXb5Mmpq2jEiJ1z5d9X48bBI4/AypUwenQK3Qh4yUu2na5+P0rtVnsspZ3i3jFuNnAcFH00diw8/HDa+Tt5Muy5J4wa1eqqdnzjx8OJJ3Y/7upK3XgLFnS30mqBUNsHUwvgWksNUtfeoYem/49bI2YDw0HRR1On+hyKwXDAAbB+fff+mM7O5vbBLFwIy5bBrrvCSScNTq1mQ90OuOvTdgYjRqRWxq67phZbLSgaOeSQ1OX3yCPpKCoze/HcorAhpaMjnZOxcCHcdBO8+tXd3Va1gwpqXYY2cHo77Lsdjlxr5jykdqiznTkobMiZMiW1SJYuhd/+tnvfRldXugTL1KlwxBFp2t12S8GyM+rLiZw9HURQPAGzdq7PLrukcZs3pyP/xo/f9tyY3lbI/blCQP0JoLX9V/Uniz73XBo+atS25ynVbmvXppqmT9/+hNLia3R2poMuejOUw8ZBYUPS7runbqsRI7rPMYEUHs88A7ffnlYgHR1w3HHdByQ0+2VvtGKrBVNtZbR5c3o8cSIcdFCqp5l51FpCxRZRbUXY2ZnmVyZi2zqKdT37bPo7alR3fZs2da9MN2/e/qz+rVu37QKsnfMD6Wi12n6kzs4Uys89B3/6U3reunVpusMPT0ezFUPnuefS32LQFFfqtcf1VwgoXg2geFADbHsFgNGjtz0cfeTI7pNEN26Exx5Lh2fXv7/ivCLSZ6NYd62mdevSfGfMSOdIFZdXT/+n+hCqzRPSZ3bEiPL/a/3ntNFnacKE8vk14qCwIav+0FqAvfdOX5qRI9OW5KJFqZsK0opzzz3Tfo6iiG1XXF1dKWy2bEkrgU2b0m3jxu1PniwenbVhQxq+cmVaEdS2wjs70/OKJ2YW57Fly7ZnvdfO09l119Q6GjFi2+cXV7DFlVD9inTYsG1X7qNGpXl2dGx7Imd/z++ZMKF7BdrRkd7vwoVw333bz1NKtdTqGjYshUb9yaTFE00H6rDzgw9ubrpVq7oPrihetWDYsPTe7rsP7r+/+yoItXDp6krnTvUWcMUTbDdvTq3cceO23UAoBv3atenzO2NG92ds7dr0d+TI7vCqfQ7Wrq21hPq/xBwUtlMZNiwd4gzpS3XQQd0nPK5albZ+IZ1AWdy6Lq5sIa0MRo9OX+pRo1Io1eZTWzHWe+YZuPvuFE61rdaxY7uDq/a84oq6t6/200/DPfekLfGJE7dfyRdvrVJc+UOq8/jjW1fPi1XW0pw4cdvDu4vWres57HrS1QVPPJH+n7XL6dSmr4VTLXBrGzi1KzjUPo/DhqVAq7Wa1q9PRwLC6F36+dYdFLZzK375J09OX9Jddkkr8OHDu1f8A6H+XJEXY8IEeM1rBmZeVq2eWra96eyEvfYqn2bSJDjhhObnOW5caqmA+n2Uq4PCLNt//3Qzs235PAozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK1VpUEg6VdIiSYslfbKH8XtLulnSXZLulXR6lfWYmVnfVRYUkjqAi4HTgBnA2ZJm1E32KeDaiHglcBbwjarqMTOz/qmyRXEUsDgilkTEJuAa4My6aQIYm++PA1ZWWI+ZmfVDlUExBVhWeLw8DyuaA5wjaTkwD/ibnmYkabakBZIWrFnzZBW1mplZL1q9M/ts4IqImAqcDlwpabuaIuLSiJgZETPHjdt90Is0M9uZVRkUK4BphcdT87Ci84BrASLidmAUMKnCmszMrI+qDIr5wIGS9pU0grSzem7dNI8BJwFIOpQUFO5bMjNrI5UFRUR0ARcANwIPko5uWijpQkmz8mQfBc6XdA9wNXBuRERVNZmZWd91VjnziJhH2kldHPbpwv0HgOOqrMHMzF6cVu/MNjOzNuegMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK9XZ7ISSpgD7FJ8TEbdWUZSZmbWPpoJC0heBtwEPAFvy4ABKg0LSqcBFQAfwrYj4px6meSswJ8/vnoh4e7PFm5lZ9ZptUbwBODgiNjY7Y0kdwMXAa4HlwHxJcyPigcI0BwJ/BxwXEasl7dF86WZmNhia3UexBBjex3kfBSyOiCURsQm4BjizbprzgYsjYjVARDzRx9cwM7OKNduiWA/cLekm4IVWRUT8bclzpgDLCo+XA0fXTXMQgKTfkLqn5kTET5usyczMBkGzQTE336p4/QOBE4GpwK2SDouIZ4oTSZoNzAaYPHnvCsowM7PeNBUUEfFtSSPILQBgUURsbvC0FcC0wuOpeVjRcuB3eV6PSHqIFBzz617/UuBSgIMPnhnN1GxmZgOjqX0Ukk4E/ou0c/obwEOSjm/wtPnAgZL2zSFzFtu3Sn5Iak0gaRIpiJY0W7yZmVWv2a6nrwCnRMQiAEkHAVcDR/b2hIjoknQBcCNp/8PlEbFQ0oXAgoiYm8edIql22O3HI+Kp/r8dMzMbaM0GxfBaSABExEOSGh4FFRHzgHl1wz5duB/AR/LNzMzaULNBsUDSt4Dv5sfvABZUU5KZmbWTZoPi/cAHgdrhsL8m7aswM7MhrtmjnjYCX803MzPbiZQGhaRrI+Ktku4jXYtpGxFxeGWVmZlZW2jUovhQ/vv6qgsxM7P2VHoeRUQ8nu+uApZFxKPASOAVwMqKazMzszbQ7EUBbwVG5d+k+BnwTuCKqooyM7P20WxQKCLWA28EvhERbwFeVl1ZZmbWLpoOCknHks6f+Eke1lFNSWZm1k6aDYoPk35g6D/yZTj2A26uriwzM2sXzZ5HcQtwS+HxErpPvjMzsyGs0XkU/zciPizpR/R8HsWsyiozM7O20KhFcWX++89VF2JmZu2pNCgi4s58dwGwISK2AkjqIJ1PYWZmQ1yzO7NvAnYtPN4F+MXAl2NmZu2m2aAYFRFraw/y/V1LpjczsyGi2aBYJ+lVtQeSjgQ2VFOSmZm1k2Z/j+LDwHWSVgICXgq8rbKqzMysbTR7HsV8SYcAB+dBiyJic3VlmZlZu2iq60nSrsD/Aj4UEfcD0yX50uNmZjuBZvdR/DuwCTg2P14B/EMlFZmZWVtpNij2j4gvAZsB8pVkVVlVZmbWNpoNik2SdiFfxkPS/sDGyqoyM7O20exRT58BfgpMk3QVcBxwblVFmZlZ+2gYFJIE/JH0o0XHkLqcPhQRqyquzczM2kDDoIiIkDQvIg6j+0eLzMxsJ9HsPoo/SPqzSisxM7O21Ow+iqOBcyQtBdaRup8iIg6vqjAzM2sPzQbF6yqtwszM2lajX7gbBbwPOAC4D7gsIroGozAzM2sPjfZRfBuYSQqJ04CvVF6RmZm1lUZdTzPy0U5Iugz4ffUlmZlZO2nUonjhCrHucjIz2zk1CopXSHo2354DDq/dl/Rso5lLOlXSIkmLJX2yZLo3SQpJM/v6BszMrFqlXU8R0dHfGUvqAC4GXgssB+ZLmhsRD9RNNwb4EPC7/r6WmZlVp9kT7vrjKGBxRCyJiE3ANcCZPUz3OeCLwPMV1mJmZv1UZVBMAZYVHi/Pw16Qf4d7WkSUXhpE0mxJCyQtWLPmyYGv1MzMelVlUJSSNAz4KvDRRtNGxKURMTMiZo4bt3v1xZmZ2QuqDIoVwLTC46l5WM0Y4OXAr/KlQY4B5nqHtplZe6kyKOYDB0raV9II4Cxgbm1kRKyJiEkRMT0ipgN3ALMiYkGFNZmZWR9VFhT5vIsLgBuBB4FrI2KhpAslzarqdc3MbGA1e1HAfomIecC8umGf7mXaE6usxczM+qdlO7PNzGzH4KAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSDgozMyvloDAzs1IOCjMzK+WgMDOzUg4KMzMr5aAwM7NSlQaFpFMlLZK0WNInexj/EUkPSLpX0k2S9qmyHjMz67vKgkJSB3AxcBowAzhb0oy6ye4CZkbE4cD1wJeqqsfMzPqnyhbFUcDiiFgSEZuAa4AzixNExM0RsT4/vAOYWmE9ZmbWD1UGxRRgWeHx8jysN+cBN/Q0QtJsSQskLViz5skBLNHMzBppi53Zks4BZgJf7ml8RFwaETMjYua4cbsPbnFmZju5zgrnvQKYVng8NQ/bhqSTgb8HToiIjRXWY2Zm/VBli2I+cKCkfSWNAM4C5hYnkPRK4BJgVkQ8UWEtZmbWT5UFRUR0ARcANwIPAtdGxEJJF0qalSf7MjAauE7S3ZLm9jI7MzNrkSq7noiIecC8umGfLtw/ucrXNzOzF68tdmabmVn7clCYmVkpB4WZmZVyUJiZWSkHhZmZlXJQmJlZKQeFmZmVclCYmVkpB4WZmZVyUJiZWSkHhZmZlXJQmJlZKQeFmZmVclCYmVkpB4WZmZVyUJiZWSkHhZmZlXJQmJlZKQeFmZmVclCYmVkpB4WZmZVyUJiZWSkHhZmZlXJQmJlZKQeFmZmVclCYmVkpB4WZmZVyUJiZWSkHhZmZlXJQmJlZKQeFmZmVclCYmVkpB4WZmZWqNCgknSppkaTFkj7Zw/iRkr6fx/9O0vQq6zEzs76rLCgkdQAXA6cBM4CzJc2om+w8YHVEHAB8DfhiVfWYmVn/dFY476OAxRGxBEDSNcCZwAOFac4E5uT71wNfl6SIiLIZb9wIXV0DX7CZ2VD0YteXVQbFFGBZ4fFy4OjepomILklrgInAquJEkmYDs/OjTSecMObhakre0WzeDYavbnUV7cHLopuXRTcvi27r9unvM6sMigETEZcClwJIWhDx3MwWl9QW0rJ43ssCL4siL4tuXhbdJC3o73Or3Jm9AphWeDw1D+txGkmdwDjgqQprMjOzPqoyKOYDB0raV9II4Cxgbt00c4F35/tvBn7ZaP+EmZkNrsq6nvI+hwuAG4EO4PKIWCjpQmBBRMwFLgOulLQYeJoUJo1cWlXNOyAvi25eFt28LLp5WXTr97KQN+DNzKyMz8w2M7NSDgozMyvVtkHhy390a2JZfETSA5LulXSTpH4fL93uGi2LwnRvkhSShuyhkc0sC0lvzZ+NhZK+N9g1DpYmviN7S7pZ0l35e3J6K+qsmqTLJT0h6f5exkvSv+TldK+kVzU144houxtp5/fDwH7ACOAeYEbdNB8AvpnvnwV8v9V1t3BZvAbYNd9//868LPJ0Y4BbgTuAma2uu4WfiwOBu4Dd8uM9Wl13C5fFpcD78/0ZwNJW113RsjgeeBVwfy/jTwduAAQcA/yumfm2a4vihct/RMQmoHb5j6IzgW/n+9cDJ0nSINY4WBoui4i4OSLW54d3kM5ZGYqa+VwAfI503bDnB7O4QdbMsjgfuDgiVgNExBODXONgaWZZBDA23x8HrBzE+gZNRNxKOoK0N2cC34nkDmC8pD0bzbddg6Kny39M6W2aiOgCapf/GGqaWRZF55G2GIaihssiN6WnRcRPBrOwFmjmc3EQcJCk30i6Q9Kpg1bd4GpmWcwBzpG0HJgH/M3glNZ2+ro+AXaQS3hYcySdA8wETmh1La0gaRjwVeDcFpfSLjpJ3U8nklqZt0o6LCKeaWlVrXE2cEVEfEXSsaTzt14eEVtbXdiOoF1bFL78R7dmlgWSTgb+HpgVERsHqbbB1mhZjAFeDvxK0lJSH+zcIbpDu5nPxXJgbkRsjohHgIdIwTHUNLMszgOuBYiI24FRwKRBqa69NLU+qdeuQeHLf3RruCwkvRK4hBQSQ7UfGhosi4hYExGTImJ6REwn7a+ZFRH9vhhaG2vmO/JDUmsCSZNIXVFLBrPIQdLMsngMOAlA0qGkoHhyUKtsD3OBd+Wjn44B1kTE442e1JZdT1Hd5T92OE0uiy8Do4Hr8v78xyJiVsuKrkiTy2Kn0OSyuBE4RdIDwBbg4xEx5FrdTS6LjwL/Jul/knZsnzsUNywlXU3aOJiU98d8BhgOEBHfJO2fOR1YDKwH3tPUfIfgsjIzswHUrl1PZmbWJhwUZmZWykFhZmalHBRmZlbKQWFmZqUcFGZ1JG2RdLek+yX9SNL4AZ7/uZK+nu/PkfSxgZy/2UBzUJhtb0NEHBERLyedo/PBVhdk1koOCrNyt1O4aJqkj0uan6/l/9nC8HflYfdIujIPOyP/Vspdkn4haXIL6jd70dryzGyzdiCpg3TZh8vy41NI10o6inQ9/7mSjiddY+xTwP+IiFWSJuRZ3AYcExEh6a+BT5DOEDbboTgozLa3i6S7SS2JB4Gf5+Gn5Ntd+fFoUnC8ArguIlYBRETt9wCmAt/P1/sfATwyOOWbDSx3PZltb0NEHAHsQ2o51PZRCPhC3n9xREQcEBGXlczn/wFfj4jDgPeSLkRntsNxUJj1Iv9q4N8CH82Xsr8R+CvSpYCmAAAAhUlEQVRJowEkTZG0B/BL4C2SJubhta6ncXRfwvndmO2g3PVkViIi7pJ0L3B2RFyZL1F9e75K71rgnHyl0s8Dt0jaQuqaOpf0q2rXSVpNCpN9W/EezF4sXz3WzMxKuevJzMxKOSjMzKyUg8LMzEo5KMzMrJSDwszMSjkozMyslIPCzMxK/X/L84hHgLrgCgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def selectwThd(m_score, inliers, thd=0.8):\n",
    "    mask = m_score < thd\n",
    "    # m_score_mask = np.select([mask])\n",
    "    m_score_mask = m_score[mask,]\n",
    "    inliers = inliers[mask,]\n",
    "    return m_score_mask, inliers\n",
    "    \n",
    "\n",
    "def flipArr(arr):\n",
    "    return arr.max() - arr\n",
    "\n",
    "# test one image in different threshold\n",
    "thds = [0.7, 0.8, 0.9, 1.0, 1.2]\n",
    "for thd in thds:\n",
    "    print(\"test thd: \", thd)\n",
    "    m_flip, m_inliers = selectwThd(m_score, inliers, thd)\n",
    "    #  = selectwThd(inliers, thd)\n",
    "    m_flip = flipArr(m_flip)\n",
    "    if verbose:\n",
    "        print(\"m_flip: \", m_flip)\n",
    "        print(\"m_inliers: \", m_inliers)\n",
    "\n",
    "        print(\"m_score: \", m_score.shape)\n",
    "        print(\"m_score: \", m_score)\n",
    "        print(\"mask: \", mask.sum())\n",
    "        print(\"m_score_mask: \", m_score_mask.shape)\n",
    "\n",
    "    ap = computeAP(m_inliers, m_flip)\n",
    "    plotAP(m_inliers, m_flip, ap)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Testing code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['superpoint_coco40_15_170k_hpatches_nms4_det0.015']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_dict = {}\n",
    "my_dict.update({'image': np.zeros(10)})\n",
    "list(inliers_exp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "x = np.random.random(20)\n",
    "y =np.random.random(20)\n",
    "z= np.random.random(20)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', alpha = 0.5, lw=3, color= 'b')\n",
    "ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', alpha = 0.5, lw=3, color= 'r')\n",
    "ax.hist(z, bins=np.arange(0, 1, 0.1), alpha = 0.5, lw=3, color= 'k')\n",
    "ax.set_xlim(-0.5, 1.5)\n",
    "ax.set_ylim(0, 7)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random\n",
    "import numpy\n",
    "from matplotlib import pyplot\n",
    "\n",
    "x = [random.gauss(3,1) for _ in range(400)]\n",
    "y = [random.gauss(4,2) for _ in range(400)]\n",
    "\n",
    "bins = numpy.linspace(-10, 10, 100)\n",
    "\n",
    "pyplot.hist(x, bins, alpha=0.5, label='x')\n",
    "pyplot.hist(y, bins, alpha=0.5, label='y')\n",
    "pyplot.legend(loc='upper right')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
